从等式中实现CRC算法



我正在处理一个设备,它说要使用这种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的所有信息。

相关内容

  • 没有找到相关文章

最新更新