CRC-CCITT是什么味道?

What flavor of CRC-CCITT?

谁能说出 CRC-CCITT 是什么味道 implemented in this code

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

但它确实展示了 CRC 的 属性,其中将 CRC 包含在经过 CRC 的数据中会产生一个已知的常量值。

该代码显示了一个基于0x11021的右移CRC16,当位反转并右移1位时变为0x8408。这是 CRC-CCITT (Kermit) 的一个变体,但与 Kermit 不同的是,它以 CRC = 0xFFFF 开始(Kermit 以 CRC = 0x0000 开始),并且在最后补充 CRC,因此它不会匹配任何 CRC显示在 lammertbies 网站上。您可以通过访问 lammertbies 网站,切换到十六进制模式并输入单个字节 80 来验证它是否与 Kermit 相似,这将导致 0x0884,这是一个字节交换的 0x8408 由于小端。

如果最后不是补码,则将 CRC 附加到数据并重新计算数据的 CRC + CRC 将 return 0x0000 的 CRC,对于任何正常的 CRC方法。使用 post 的补码,您将获得一个常量,具体取决于使用的 CRC 实现,在本例中为 0x470F(由于小端字节序而再次交换字节)。

要对此进行测试,请转到 lammertbies 网站,在字符串前加上十六进制 21 F3,这将导致 Kermit CRC 在处理 21 F3 后为 0xFFFF。切换到十六进制输入并输入字符串:

21F3313233343536373839

这将导致 Kermit CRC returning

0x916F

补码是

0x6e90

您可以通过以下更改更改 Dr Dobb 的示例代码以匹配 Kermit:

    crc = 0;     /* instead of crc = 0xffff; */
    /* ... */
    /* crc = ~crc;  comment out this line    */