BitStream
Loading...
Searching...
No Matches
crc.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cstdint>
5#include <cstring>
6
7namespace bitstream::utility
8{
9 inline constexpr auto CHECKSUM_TABLE = []()
10 {
11 constexpr uint32_t POLYNOMIAL = 0xEDB88320;
12
13 std::array<uint32_t, 0x100> table{};
14
15 for (uint32_t i = 0; i < 0x100; ++i)
16 {
17 uint32_t item = i;
18 for (uint32_t bit = 0; bit < 8; ++bit)
19 item = ((item & 1) != 0) ? (POLYNOMIAL ^ (item >> 1)) : (item >> 1);
20 table[i] = item;
21 }
22
23 return table;
24 }();
25
26 inline uint32_t crc_uint32(uint32_t checksum, const uint8_t* bytes, uint32_t size)
27 {
28 uint32_t result = 0xFFFFFFFF;
29
30 uint8_t checksum_table[4]{};
31 std::memcpy(&checksum_table, &checksum, sizeof(uint32_t));
32
33 for (uint32_t i = 0; i < 4; i++)
34 result = CHECKSUM_TABLE[(result & 0xFF) ^ *(checksum_table + i)] ^ (result >> 8);
35
36 for (uint32_t i = 0; i < size; i++)
37 result = CHECKSUM_TABLE[(result & 0xFF) ^ *(bytes + i)] ^ (result >> 8);
38
39 return ~result;
40 }
41}
Definition bits.h:7
constexpr auto CHECKSUM_TABLE
Definition crc.h:9
uint32_t crc_uint32(uint32_t checksum, const uint8_t *bytes, uint32_t size)
Definition crc.h:26
Type for checksums.
Definition checksum_trait.h:16