我正在处理一个说要使用这个 16 位循环冗余校验的设备:
CCITT CRC-16 with polynomial x^16 + x^12 + x^5 + x^1
我寻找了这种算法的实现,但我确实只找到了等式的最后一项等于1
(ie x^0
) 而不是 的算法x^1
,例如this one或this。
当我意识到我不知道如何开始时,我打算自己实现算法。应该如何从方程开始进行 CRC 计算?
此 PDF 文件解释了主题:hackersdelight.org/crc.pdf。
我还推荐 Andrew Tanenbaum 的 Computer Networks,因为它有一章是关于 CRC 算法的。
最后,我会仔细检查您的设备是否确实实现了这种形式的 CRC,而不是标准的。这可能只是一个错字。
你是对的,多项式是错的。正确的 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 的所有信息。