为什么"1"的CRC产生生成器多项式本身?



在测试CRC实现时,我注意到0x01的CRC通常(?(似乎是多项式本身。但是,当尝试手动执行二进制长除法时,我最终会丢失多项式的前导"1",例如,使用"0x01"和多项式"0x1021"的消息,我会得到

1 0000 0000 0000 (zero padded value)
(XOR) 1 0000 0010 0001
-----------------
0 0000 0010 0001 = 0x0021

但是任何示例实现(我在这里处理XMODEM-CRC(都会导致给定输入0x1021。

查看 https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks,我可以看到上位的 XOR 步长离开移位寄存器与生成器多项式将如何导致此结果。我不明白的是为什么这一步是以这种方式执行的,因为它清楚地改变了真正的多项式除法的结果?

我刚刚阅读了 http://www.ross.net/crc/download/crc_v3.txt,并注意到在第 9 节中,提到了隐式前置 1 以强制执行所需的多项式宽度。

在我的示例中,这意味着用作除数的实际多项式不会0x1021,而是0x11021。这导致前导"1"被删除,其余部分是"预期的"16位多项式:

1 0000 0000 0000 0000 (zero padded value)
(XOR) 1 0001 0000 0010 0001
-----------------
0 0001 0000 0010 0001 = 0x1021

最新更新