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,