diff --git a/include/nlohmann/detail/output/binary_writer.hpp b/include/nlohmann/detail/output/binary_writer.hpp index f995d31ce..3f0b786b6 100644 --- a/include/nlohmann/detail/output/binary_writer.hpp +++ b/include/nlohmann/detail/output/binary_writer.hpp @@ -1723,7 +1723,7 @@ class binary_writer oa->write_character(to_char_type(0x8D)); write_number(static_cast(value)); } - else if (value < -33554432 || value > 67108863) + else if (value < -33554432 || value > 67637031) { // 32 bit integers oa->write_character(to_char_type(0x8C)); @@ -1764,23 +1764,26 @@ class binary_writer JSON_ASSERT(value >= 0); oa->write_character(static_cast(0x90 + value)); } - else if (value <= 3839) + else if (value <= 3879) { - JSON_ASSERT(value >= 0); + JSON_ASSERT(value >= 40); + value -= 40; oa->write_character(static_cast(0xC2 + (value >> 7 & 0x1F))); oa->write_character(static_cast(value & 0x7F)); } - else if (value <= 524287) + else if (value <= 528167) { - JSON_ASSERT(value >= 0); + JSON_ASSERT(value >= 3880); + value -= 3880; oa->write_character(static_cast(0xE0 + (value >> 15 & 0x0F))); oa->write_character(static_cast(value >> 8 & 0x7F)); oa->write_character(static_cast(value)); } else { - JSON_ASSERT(value >= 0); - JSON_ASSERT(value <= 67108863); + JSON_ASSERT(value >= 528168); + JSON_ASSERT(value <= 67637031); + value -= 528168; oa->write_character(static_cast(0xF0 + (value >> 23 & 0x17))); oa->write_character(static_cast(value >> 16 & 0x7F)); oa->write_character(static_cast(value >> 8)); diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index feda56644..e50c9a751 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -15297,7 +15297,7 @@ class binary_writer oa->write_character(to_char_type(0x8D)); write_number(static_cast(value)); } - else if (value < -33554432 || value > 67108863) + else if (value < -33554432 || value > 67637031) { // 32 bit integers oa->write_character(to_char_type(0x8C)); @@ -15338,23 +15338,26 @@ class binary_writer JSON_ASSERT(value >= 0); oa->write_character(static_cast(0x90 + value)); } - else if (value <= 3839) + else if (value <= 3879) { - JSON_ASSERT(value >= 0); + JSON_ASSERT(value >= 40); + value -= 40; oa->write_character(static_cast(0xC2 + (value >> 7 & 0x1F))); oa->write_character(static_cast(value & 0x7F)); } - else if (value <= 524287) + else if (value <= 528167) { - JSON_ASSERT(value >= 0); + JSON_ASSERT(value >= 3880); + value -= 3880; oa->write_character(static_cast(0xE0 + (value >> 15 & 0x0F))); oa->write_character(static_cast(value >> 8 & 0x7F)); oa->write_character(static_cast(value)); } else { - JSON_ASSERT(value >= 0); - JSON_ASSERT(value <= 67108863); + JSON_ASSERT(value >= 528168); + JSON_ASSERT(value <= 67637031); + value -= 528168; oa->write_character(static_cast(0xF0 + (value >> 23 & 0x17))); oa->write_character(static_cast(value >> 16 & 0x7F)); oa->write_character(static_cast(value >> 8)); diff --git a/test/src/unit-bon8.cpp b/test/src/unit-bon8.cpp index 4a56d7775..b5135b033 100644 --- a/test/src/unit-bon8.cpp +++ b/test/src/unit-bon8.cpp @@ -98,69 +98,69 @@ TEST_CASE("BON8") } } - SECTION("40..3839") + SECTION("40..3879") { SECTION("40") { json j = 40U; - std::vector expected = {0xC2, 0x28}; + std::vector expected = {0xC2, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("3839") + SECTION("3879") { - json j = 3839U; + json j = 3879U; std::vector expected = {0xDF, 0x7F}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("3840..524287") + SECTION("3880..524287") { - SECTION("3840") + SECTION("3880") { - json j = 3840U; - std::vector expected = {0xE0, 0x0F, 0x00}; + json j = 3880U; + std::vector expected = {0xE0, 0x00, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("524287") + SECTION("528167") { - json j = 524287U; + json j = 528167U; std::vector expected = {0xEF, 0x7F, 0xFF}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("524288..67108863") + SECTION("528168..67637031") { - SECTION("524288") + SECTION("528168") { - json j = 524288U; - std::vector expected = {0xF0, 0x08, 0x00, 0x00}; + json j = 528168U; + std::vector expected = {0xF0, 0x00, 0x00, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("67108863") + SECTION("67637031") { - json j = 67108863U; + json j = 67637031U; std::vector expected = {0xF7, 0x7F, 0xFF, 0xFF}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("67108864..2147483647 (int32max)") + SECTION("67637032..2147483647 (int32max)") { - SECTION("67108864") + SECTION("67637032") { - json j = 67108864U; - std::vector expected = {0x8C, 0x04, 0x00, 0x00, 0x00}; + json j = 67637032U; + std::vector expected = {0x8C, 0x04, 0x08, 0x0F, 0x28}; const auto result = json::to_bon8(j); CHECK(result == expected); } @@ -337,69 +337,69 @@ TEST_CASE("BON8") } } - SECTION("40..3839") + SECTION("40..3879") { SECTION("40") { json j = 40; - std::vector expected = {0xC2, 0x28}; + std::vector expected = {0xC2, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("3839") + SECTION("3879") { - json j = 3839; + json j = 3879; std::vector expected = {0xDF, 0x7F}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("3840..524287") + SECTION("3880..524287") { - SECTION("3840") + SECTION("3880") { - json j = 3840; - std::vector expected = {0xE0, 0x0F, 0x00}; + json j = 3880; + std::vector expected = {0xE0, 0x00, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("524287") + SECTION("528167") { - json j = 524287; + json j = 528167; std::vector expected = {0xEF, 0x7F, 0xFF}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("524288..67108863") + SECTION("528168..67637031") { - SECTION("524288") + SECTION("528168") { - json j = 524288; - std::vector expected = {0xF0, 0x08, 0x00, 0x00}; + json j = 528168; + std::vector expected = {0xF0, 0x00, 0x00, 0x00}; const auto result = json::to_bon8(j); CHECK(result == expected); } - SECTION("67108863") + SECTION("67637031") { - json j = 67108863; + json j = 67637031; std::vector expected = {0xF7, 0x7F, 0xFF, 0xFF}; const auto result = json::to_bon8(j); CHECK(result == expected); } } - SECTION("67108864..2147483647 (int32max)") + SECTION("67637032..2147483647 (int32max)") { - SECTION("67108864") + SECTION("67637032") { - json j = 67108864; - std::vector expected = {0x8C, 0x04, 0x00, 0x00, 0x00}; + json j = 67637032; + std::vector expected = {0x8C, 0x04, 0x08, 0x0F, 0x28}; const auto result = json::to_bon8(j); CHECK(result == expected); }