繁体   English   中英

CRC-使用不同多项式表示法的16位查找表

[英]CRC - 16bit Lookup table using different polynomial notations

我正在使用16位CRC,并具有一个查找表(LUT)生成器,该生成器为给定的多项式生成LUT。 我使用的生成器代码使用Koopman表示法(例如CCITT为0x8810),因此将第一行表生成为:

 0x0000, 0x8810, 0x9830, 0x1020, 0xB870, 0x3060, 0x2040, 0xA850,

我在互联网上找到了已经计算出的CCITT表及其实现,但是显然使用了另一种表示法,第一行的代码为:

0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 

我的问题是:短记号和长记号(0x8810与0x11021)在不同的表中是否会产生相同的结果(即LUT的用法不同),或者在不同的记号中使用相同的多项式,CRC是否不同?

ps: 据我所知,0x8810和0x11021是非反射的Koopman /“正常”符号,而0x8408和0x10811是反射的(对于CCITT)

pps:第二张表的“使用代码”为:

uint16_t crc16_block(uint16_t crc, uint8_t *data, int len){
    int i;

    for (i = 0; i < len; i++)
        crc = (crc << 8) ^ crc16_tbl[(crc >> 8) ^ data[i]];

    return crc;
}

Koopman的表示法表示多项式,但不是多项式。 您不能将其用作您使用的查找表生成器的输入。 您的第一个表没有用,因为隐式多项式的低位不为1。

Koopman的表示法取决于所有CRC多项式均以1结尾的事实。多项式始终具有+ 1项。 当转换为二进制时,它们始终以1( x的最大幂)开头,并且始终以1结尾。例如,对于CCITT多项式, x 16 + x 12 + x 5 +1为10001000000100001或0x11021。

关于这个数字的烦人的事情是它需要17位来表示。 您可能希望使用仅使用16位的表示法,以便更轻松地在计算机程序中使用16位整数指定多项式(或类似地,需要32位而不是33位来指定32位CRC)。

有两种解决方案。 降低高1或降低低1。通常您会看到高1下降。 即0x1021,然后您还需要提供CRC的长度,在这种情况下为16。 因此规格为16,0x1021。 (您还需要指定其他内容,但现在,我们将自己限制在CRC和多项式的大小之内。)

Koopman意识到,如果您改为降低低位 1,则甚至不需要指定长度,而仍然可以以16位为单位指定16位CRC多项式。 您可以通过向下移动1来降低低1。 因此0x11021变为0x8810。 高1仍然存在,因此它隐式定义了CRC的长度。

但是,要在Koopman表示法中使用 CRC, 必须将其上移一位并加1以得到用于计算和表的多项式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM