3

我正在处理一个说要使用这个 16 位循环冗余校验的设备:

CCITT CRC-16 with polynomial x^16 + x^12 + x^5 + x^1

我寻找了这种算法的实现,但我确实只找到了等式的最后一项等于1(ie x^0) 而不是 的算法x^1,例如this onethis

当我意识到我不知道如何开始时,我打算自己实现算法。应该如何从方程开始进行 CRC 计算?

4

2 回答 2

2

此 PDF 文件解释了主题:hackersdelight.org/crc.pdf

我还推荐 Andrew Tanenbaum 的 Computer Networks,因为它有一章是关于 CRC 算法的。

最后,我会仔细检查您的设备是否确实实现了这种形式的 CRC,而不是标准的。这可能只是一个错字。

于 2013-02-18T12:29:31.700 回答
1

你是对的,多项式是错的。正确的 CRC 多项式必须始终具有 1 项。CCITT CRC-16 多项式是 x^16 + x^12 + x^5 + 1,如@guga 所述,或位形式的 0x1021(不包含 x^16)。请参阅此16 位 CRC 目录

除了多项式之外,那里的信息还提供了您需要的其他关键信息。具体来说:

width=16 poly=0x1021 init=0x1d0f refin=false refout=false xorout=0x0000 check=0xe5cc

这意味着 CRC 不是位反射的,它是用 初始化的0x1d0f,并且结果不是与任何东西异或。所以无字节的 CCITT CRC 为0x1d0f。它还提供了对 ASCII 数字“123456789”的九字节字符串的校验值0xe5cc。您应该使用它来检查您的实现。

Ross Williams 指南将告诉您有关实施 CRC 的所有信息。

于 2013-02-18T17:27:41.603 回答