20 for (
const uint8_t
byte : bytes) {
21 state.
a =
static_cast<uint8_t
>(state.a + byte);
22 state.b =
static_cast<uint8_t
>(state.b + state.a);
28[[nodiscard]]
constexpr uint16_t
crc16Xmodem(std::span<const uint8_t> bytes)
31 for (
const uint8_t
byte : bytes) {
32 uint8_t x =
static_cast<uint8_t
>((crc >> 8) ^
byte);
34 crc =
static_cast<uint16_t
>((crc << 8) ^ (x << 12) ^ (x << 5) ^ x);
40[[nodiscard]]
constexpr uint32_t
crc24q(std::span<const uint8_t> bytes)
43 for (
const uint8_t
byte : bytes) {
44 crc ^= uint32_t(
byte) << 16;
45 for (
int bit = 0; bit < 8; ++bit) {
47 if (crc & 0x1000000) {
52 return crc & 0xffffff;
56[[nodiscard]]
constexpr uint8_t
nmeaChecksum(std::span<const uint8_t> body)
59 for (
const uint8_t
byte : body) {
constexpr uint32_t crc24q(std::span< const uint8_t > bytes)
CRC-24Q: polynomial 0x1864CFB, initial value 0, no reflection and no final XOR.
constexpr uint8_t nmeaChecksum(std::span< const uint8_t > body)
XOR of all bytes, the checksum NMEA 0183 sentences carry over their body.
constexpr uint16_t crc16Xmodem(std::span< const uint8_t > bytes)
CRC-16/XMODEM: polynomial 0x1021, initial value 0, no reflection and no final XOR.
constexpr Fletcher8 fletcher8(std::span< const uint8_t > bytes, Fletcher8 state={})
Continues state over bytes, so a frame checksummed in parts matches the contiguous result.
8-bit Fletcher checksum: two running byte sums modulo 256.
constexpr bool operator==(const Fletcher8 &) const =default