试图理解CRC16 CCITT的this解释,我遇到了术语"截断多项式" 。比较单字节消息的长手计算和相应的C代码,我发现poly
的宏定义与上面的计算示例不匹配。在C代码中,多项式为0x1021
,而在上面的计算示例中,使用的多项式更大,0x11021
。
他们使用术语截断多项式:0x1021
。他们使用什么模式将此0x1021
扩展到此0x11021
?
答案 0 :(得分:1)
0x11021
表示来自F2 [X]的多项式p = x^16+x^12+x^5+x^0
。消息(连同初始值和扩充)也由多项式表示。 CRC基本上只是消息模多项式p
。因此CRC从不需要超过2个字节。由于p = 0 mod p
我们可以写x^16 = x^12+x^5+x^0 mod p
。因此0x1021
代表x^12+x^5+x^0
。
现在让我们看看update_good_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;
}
}
检查good_crc的最高位是否设置为零。换句话说,它检查x ^ 15处的系数是否设置为1或0。
if (good_crc & 0x8000)
{
xor_flag= 1;
}
good_crc = good_crc << 1;
这将good_crc乘以x。因此,x^15
处的系数变为x^16
处的系数,而good_crc“溢出”其16位(这就是我们存储xor_flag的原因)。
good_crc = good_crc ^ poly;
如果设置了xor_flag
,那么这会从good_crc中“减去”x^16 = x^12+x^5+x^0 mod p
。