问题不在于 CRC 是 32 位,而在于 CRC 是后补码,xorout = 0xffffffff。如果将 CRC(小尾数)附加到消息中,然后再次计算 CRC,如果没有错误,则 CRC 将始终为 0x2144DF1C。因此,在本例中,您将根据 0x2144DF1C 验证 CRC。
您可能会发现这个在线 CRC 计算器信息更丰富,因为它显示了参数:多项式、xorin、xorout。
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
为了解释发生了什么,通常如果您计算并附加一个非互补的 CRC 到消息中,然后计算消息的 CRC + CRC,所得的 CRC 为零(如果没有错误)。让 CRC32X = 初始值 = 0 且 xorout = 0 的自定义 CRC32。您可以使用我发布链接的在线 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
并取补码(使用 ~ 表示 not):
~CRC32X{0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF} = ~0xDEBB20E3 = 0x2144DF1C
初始值与消息的前 4 个字节进行异或。因此,对于初始值为 0xFFFFFFFF 的 CRC32(),以及后补 CRC:
CRC32(0x00 0x00 0x00 0x00) = 0x2144DF1C
~CRC32X(0xFF 0xFF 0xFF 0xFF) = ~0xDEBB20E3 = 0x2144DF1C