谁能告诉我们implemented in this code是什么口味的CRC-CCITT?
当我使用它来计算“ 123456789”上的CRC时,得到0x6E90。但这与此处的任何CRC不匹配:https://www.lammertbies.nl/comm/info/crc-calculation.html
但是它确实表现出了CRC的特性,其中将CRC包含在经过CRC校验的数据中会得出一个已知的常数值。
答案 0 :(得分:3)
代码显示基于0x11021的右移CRC16,当位反转并右移1位时,其变为0x8408。这是CRC-CCITT(Kermit)的变体,但与Kermit不同,它以CRC = 0xFFFF开头(Kermit以CRC = 0x0000开头),最后以CRC的形式补充,因此它与任何CRC都不匹配。显示在lammertbies网站上。您可以通过访问lammertbies网站,切换到十六进制模式并输入单个字节80来验证它是否与Kermit相似,这将导致0x0884,由于字节序少,该字节被交换为0x8408。
如果最后没有一个补码,那么对于任何普通的CRC方法,将CRC附加到数据上并重新计算该数据的CRC + CRC将返回CRC 0x0000。使用后置补码,您将获得一个常数,具体取决于所使用的CRC实现,在这种情况下为0x470F(由于字节序少,字节被再次交换)。
要对此进行测试,请访问lammertbies网站,在字符串前添加十六进制21 F3,这将在处理21 F3之后使Kermit CRC为0xFFFF。切换到十六进制输入并输入字符串:
21F3313233343536373839
这将导致Kermit CRC返回
0x916F
互补时为
0x6e90
您可以更改Dobb博士的示例代码,以使Kermit与以下更改匹配:
crc = 0; /* instead of crc = 0xffff; */
/* ... */
/* crc = ~crc; comment out this line */