我过去曾接触CRC-16校验和,并习惯通过重新计算要验证的文件及其2个字节的CRC-16校验和来验证它。如果结果为零,则文件完整性有效,否则无效。可以使用以下伪代码来编写此操作:
if (recalculated_crc16_checksum != 0)
// 错误:文件完整性已损坏
else
// 成功:文件完整性有效
最近,我想使用CRC-32校验和进行文件完整性检查,并尝试以同样的方式验证它,但似乎这种“与零比较技巧”在这里不可行?例如,如果我在CRC在线计算器上使用32位值0xDEADBEEF:
CRC-16-Modbus(0xDEADBEEF) = 0xC19B
(相同的输入值,但附加了反转字节顺序的校验和0xC19B)
CRC-16-Modbus(0xDEADBEEF9BC1) = 0x0000
但是:
CRC-32(0xDEADBEEF) = 0x7C9CA35A
(我尝试了大端和小端字节顺序来附加校验和)
CRC-32(0xDEADBEEF7C9CA35A) = 0x01F92292 != 0x00000000
CRC-32(0xDEADBEEF5AA39C7C) = 0x2144DF1C != 0x00000000
请问有人能解释一下,为什么这个“与零比较技巧”在CRC-32中不起作用吗?