fix endianess bug in uint8 parsing

Signed-off-by: Shikhar <shikharish05@gmail.com>
This commit is contained in:
Shikhar 2025-12-31 21:51:23 +05:30
parent 11ce67e5eb
commit fb522b66d0

View File

@ -42,6 +42,11 @@ fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) {
(val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56; (val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56;
} }
fastfloat_really_inline constexpr uint32_t byteswap_32(uint32_t val) {
return (val >> 24) | ((val >> 8) & 0x0000FF00u) | ((val << 8) & 0x00FF0000u) |
(val << 24);
}
// Read 8 UC into a u64. Truncates UC if not char. // Read 8 UC into a u64. Truncates UC if not char.
template <typename UC> template <typename UC>
fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t
@ -533,7 +538,7 @@ parse_int_string(UC const *p, UC const *pend, T &value,
} }
digits = std::bit_cast<uint32_t>(str); digits = std::bit_cast<uint32_t>(str);
#if FASTFLOAT_IS_BIG_ENDIAN #if FASTFLOAT_IS_BIG_ENDIAN
digits = byteswap(digits); digits = byteswap_32(digits);
#endif #endif
} }
#else #else
@ -543,18 +548,14 @@ parse_int_string(UC const *p, UC const *pend, T &value,
else if (len >= 4) { else if (len >= 4) {
::memcpy(&digits, p, 4); ::memcpy(&digits, p, 4);
#if FASTFLOAT_IS_BIG_ENDIAN #if FASTFLOAT_IS_BIG_ENDIAN
digits = byteswap(digits); digits = byteswap_32(digits);
#endif #endif
} else { } else {
uint32_t b0 = static_cast<uint8_t>(p[0]); uint32_t b0 = static_cast<uint8_t>(p[0]);
uint32_t b1 = (len > 1) ? static_cast<uint8_t>(p[1]) : 0xFFu; uint32_t b1 = (len > 1) ? static_cast<uint8_t>(p[1]) : 0xFFu;
uint32_t b2 = (len > 2) ? static_cast<uint8_t>(p[2]) : 0xFFu; uint32_t b2 = (len > 2) ? static_cast<uint8_t>(p[2]) : 0xFFu;
uint32_t b3 = 0xFFu; uint32_t b3 = 0xFFu;
#if FASTFLOAT_IS_BIG_ENDIAN
digits = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
#else
digits = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24); digits = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
#endif
} }
uint32_t magic = uint32_t magic =