Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CRC16 CCITT上下文中,截断多项式的含义是什么_C_Crc16 - Fatal编程技术网

在CRC16 CCITT上下文中,截断多项式的含义是什么

在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

为了理解CRC16 CCITT的解释,我遇到了术语“截断多项式”。比较单字节消息的长时间计算和相应的C代码,我发现
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;
    }