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;
}
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.
template <typename UC>
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);
#if FASTFLOAT_IS_BIG_ENDIAN
digits = byteswap(digits);
digits = byteswap_32(digits);
#endif
}
#else
@ -543,18 +548,14 @@ parse_int_string(UC const *p, UC const *pend, T &value,
else if (len >= 4) {
::memcpy(&digits, p, 4);
#if FASTFLOAT_IS_BIG_ENDIAN
digits = byteswap(digits);
digits = byteswap_32(digits);
#endif
} else {
uint32_t b0 = static_cast<uint8_t>(p[0]);
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 b3 = 0xFFu;
#if FASTFLOAT_IS_BIG_ENDIAN
digits = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
#else
digits = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
#endif
}
uint32_t magic =