Проблема не в том, что CRC является 32-битным, а в том, что CRC является посткомплементарным, xorout = 0xffffffff. Если вы добавите CRC (little-endian) к сообщению, а затем снова вычислите CRC, если ошибок нет, CRC всегда будет 0x2144DF1C. Таким образом, в этом случае вы проверяете CRC против 0x2144DF1C.
Вы можете найти этот онлайн-калькулятор CRC немного более информативным, поскольку он показывает параметры: polynomial, xorin, xorout.
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
Чтобы объяснить, что происходитобычно, если вы вычисляете и добавляете несопоставленный CRC к сообщению, а затем вычисляете CRC сообщения + CRC, результирующий CRC равен нулю (если ошибок нет). Пусть CRC32X = пользовательский CRC32 с начальным значением = 0 и xorout = 0. Вы можете скопировать и вставить данные ниже с помощью онлайн-калькулятора CRC, на который я разместил ссылку.
CRC32X{0x31 0x32 0x33 0x34} = 0xBAA73FBF
добавление CRC и повторный расчет:
CRC32X{0x31 0x32 0x33 0x34 0xBF 0x3F 0xA7 0xBA} = 0x00000000
Теперь рассмотрим более простой случай:
CRC32X{0x00 0x00 0x00 0x00} = 0x00000000
CRC32X{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00} = 0x00000000
Затем, чтобы увидеть эффект дополнения CRC идобавив его:
CRC32X{0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF} = 0xDEBB20E3
и взяв дополнение (используя ~ для не):
~CRC32X{0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF} = ~0xDEBB20E3 = 0x2144DF1C
Начальное значение XOR 'с первыми 4 байтами сообщения. Таким образом, для CRC32 () с начальным значением 0xFFFFFFFF и пост-дополненным CRC:
CRC32(0x00 0x00 0x00 0x00) = 0x2144DF1C
~CRC32X(0xFF 0xFF 0xFF 0xFF) = ~0xDEBB20E3 = 0x2144DF1C