【问题标题】:CRC - 16bit Lookup table using different polynomial notationsCRC - 使用不同多项式符号的 16 位查找表
【发布时间】:2015-06-30 07:31:54
【问题描述】:

我正在使用 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;
}

【问题讨论】:

    标签: c crc


    【解决方案1】:

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

    Koopman 的符号取决于所有 CRC 多项式都以 1 结尾的事实。多项式总是有一个 + 1 项。当转换为二进制时,它们总是以 1(x 的最高幂)开始,并且总是以 1 结束。 10001000000100001 或 0x11021,对于 CCITT 多项式 x16+x12+x5+1

    这个数字的烦人之处在于它需要 17 位来表示。您希望有一个仅使用 16 位的表示法,以便更容易地在具有 16 位整数的计算机程序中指定多项式(或者类似地,需要 32 位而不是 33 位来指定 32 位 CRC)。

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

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

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

    【讨论】:

    • 非常感谢您提供详细易懂的答案!
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多