CRC16 CCITT上下文中截断多项式的含义

时间:2016-11-24 13:21:27

标签: c crc16

试图理解CRC16 CCITT的this解释,我遇到了术语"截断多项式" 。比较单字节消息的长手计算和相应的C代码,我发现poly的宏定义与上面的计算示例不匹配。在C代码中,多项式为0x1021,而在上面的计算示例中,使用的多项式更大,0x11021

他们使用术语截断多项式:0x1021。他们使用什么模式将此0x1021扩展到此0x11021

1 个答案:

答案 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;
    }
}
  1. 检查good_crc的最高位是否设置为零。换句话说,它检查x ^ 15处的系数是否设置为1或0。

    if (good_crc & 0x8000)
    {
        xor_flag= 1;
    }
    
  2. good_crc = good_crc << 1;这将good_crc乘以x。因此,x^15处的系数变为x^16处的系数,而good_crc“溢出”其16位(这就是我们存储xor_flag的原因)。

  3. good_crc = good_crc ^ poly;如果设置了xor_flag,那么这会从good_crc中“减去”x^16 = x^12+x^5+x^0 mod p