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