13 const uint32_t* GetCRCTable() {
15 static constexpr uint32_t polynomial = 0xEDB88320;
17 static bool is_initialized =
false;
18 static uint32_t crc_table[256];
20 if (!is_initialized) {
21 for (uint32_t i = 0; i < 256; i++) {
23 for (
size_t j = 0; j < 8; j++) {
25 c = polynomial ^ (c >> 1);
33 is_initialized =
true;
41 namespace fusion_engine {
46 uint32_t initial_value) {
47 static const uint32_t* crc_table = ::GetCRCTable();
48 uint32_t c = initial_value ^ 0xFFFFFFFF;
49 const uint8_t* u =
static_cast<const uint8_t*
>(buffer);
50 for (
size_t i = 0; i < length; ++i) {
51 c = crc_table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
53 return c ^ 0xFFFFFFFF;
58 static constexpr
size_t offset = offsetof(
MessageHeader, protocol_version);
62 return CalculateCRC(
reinterpret_cast<const uint8_t*
>(&header) + offset,