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                       uint32_t initial_value = 0) {
 
   42   static const uint32_t* crc_table = GetCRCTable();
 
   43   uint32_t c = initial_value ^ 0xFFFFFFFF;
 
   44   const uint8_t* u = 
static_cast<const uint8_t*
>(buffer);
 
   45   for (
size_t i = 0; i < length; ++i) {
 
   46     c = crc_table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
 
   48   return c ^ 0xFFFFFFFF;
 
   53 namespace fusion_engine {
 
   58   static constexpr 
size_t offset = offsetof(
MessageHeader, protocol_version);