CRC-CCITT有什么风味?

时间:2018-10-28 19:50:16

标签: crc crc16

谁能告诉我们implemented in this code是什么口味的CRC-CCITT?

当我使用它来计算“ 123456789”上的CRC时,得到0x6E90。但这与此处的任何CRC不匹配:https://www.lammertbies.nl/comm/info/crc-calculation.html

但是它确实表现出了CRC的特性,其中将CRC包含在经过CRC校验的数据中会得出一个已知的常数值。

1 个答案:

答案 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    */