Skip to content

Commit 6499e20

Browse files
authored
Merge pull request #357 from shikharish/endian-uint8-fix
fix endianess bug in uint8 parsing
2 parents 11ce67e + fb522b6 commit 6499e20

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

include/fast_float/ascii_number.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) {
4242
(val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56;
4343
}
4444

45+
fastfloat_really_inline constexpr uint32_t byteswap_32(uint32_t val) {
46+
return (val >> 24) | ((val >> 8) & 0x0000FF00u) | ((val << 8) & 0x00FF0000u) |
47+
(val << 24);
48+
}
49+
4550
// Read 8 UC into a u64. Truncates UC if not char.
4651
template <typename UC>
4752
fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t
@@ -533,7 +538,7 @@ parse_int_string(UC const *p, UC const *pend, T &value,
533538
}
534539
digits = std::bit_cast<uint32_t>(str);
535540
#if FASTFLOAT_IS_BIG_ENDIAN
536-
digits = byteswap(digits);
541+
digits = byteswap_32(digits);
537542
#endif
538543
}
539544
#else
@@ -543,18 +548,14 @@ parse_int_string(UC const *p, UC const *pend, T &value,
543548
else if (len >= 4) {
544549
::memcpy(&digits, p, 4);
545550
#if FASTFLOAT_IS_BIG_ENDIAN
546-
digits = byteswap(digits);
551+
digits = byteswap_32(digits);
547552
#endif
548553
} else {
549554
uint32_t b0 = static_cast<uint8_t>(p[0]);
550555
uint32_t b1 = (len > 1) ? static_cast<uint8_t>(p[1]) : 0xFFu;
551556
uint32_t b2 = (len > 2) ? static_cast<uint8_t>(p[2]) : 0xFFu;
552557
uint32_t b3 = 0xFFu;
553-
#if FASTFLOAT_IS_BIG_ENDIAN
554-
digits = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
555-
#else
556558
digits = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
557-
#endif
558559
}
559560

560561
uint32_t magic =

0 commit comments

Comments
 (0)