在CRC16 CCITT上下文中,截断多项式的含义是什么
为了理解CRC16 CCITT的解释,我遇到了术语“截断多项式”。比较单字节消息的长时间计算和相应的C代码,我发现在CRC16 CCITT上下文中,截断多项式的含义是什么,c,crc16,C,Crc16,为了理解CRC16 CCITT的解释,我遇到了术语“截断多项式”。比较单字节消息的长时间计算和相应的C代码,我发现poly的宏定义与上面的计算示例不匹配。在C代码中,多项式是0x1021,而在上面的计算示例中,使用的多项式更大,0x11021 他们使用术语截断多项式来表示:0x1021。他们使用什么模式将这个0x1021扩展到这个0x11021?0x11021表示从F2[x]开始的多项式p=x^16+x^12+x^5+x^0。消息(连同初始值和增广)也用多项式表示。CRC基本上就是消息模多项式p
poly
的宏定义与上面的计算示例不匹配。在C代码中,多项式是0x1021
,而在上面的计算示例中,使用的多项式更大,0x11021
他们使用术语截断多项式来表示:
0x1021
。他们使用什么模式将这个0x1021
扩展到这个0x11021
?0x11021
表示从F2[x]开始的多项式p=x^16+x^12+x^5+x^0
。消息(连同初始值和增广)也用多项式表示。CRC基本上就是消息模多项式p
。因此,CRC永远不需要超过2个字节。由于p=0模p
我们可以编写x^16=x^12+x^5+x^0模p
。所以0x1021
表示x^12+x^5+x^0
现在让我们看看update\u good\u crc
是如何工作的:
void update_good_crc(unsigned short ch)
{
unsigned short i, v, xor_flag;
/*
Align test bit with leftmost bit of the message byte.
*/
v = 0x80;
for (i=0; i<8; i++)
{
if (good_crc & 0x8000)
{
xor_flag= 1;
}
else
{
xor_flag= 0;
}
good_crc = good_crc << 1;
if (ch & v)
{
/*
Append next bit of message to end of CRC if it is not zero.
The zero bit placed there by the shift above need not be
changed if the next bit of the message is zero.
*/
good_crc= good_crc + 1;
}
if (xor_flag)
{
good_crc = good_crc ^ poly;
}
/*
Align test bit with next bit of the message byte.
*/
v = v >> 1;
}
}
00010000000000100001
时,为什么他们使用10000000000100001
作为多项式?他们怎么会在前面加上1
?这个1
是从哪里来的?此外,进入C
codeI@Hairi我指的是x中的多项式,所有系数都是0或1。我想那是多项式环的别致名字。。。。他们不使用这个00010000000000100001
,而是使用这个10000000000100001
,它不是0x11021
,而是0x1021
。我看到了“Long Hand Calculation”中的多项式表示法和“C代码”@Hairi中的不同之处,在这里您可以发现您应该使用由100000000001表示的多项式。这就是生成错误检测代码的生成器多项式。在C代码中,他们使用0x1021,因为第一位没有将其转换为2个字节,这就是为什么将最高有效位的值保留在xor_标志中。
if (good_crc & 0x8000)
{
xor_flag= 1;
}