在测试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步与生成多项式一起离开移位寄存器将如何导致此结果。我不明白是为什么为什么要以这种方式执行此步骤,因为它显然改变了真正的多项式除法的结果?
答案 0 :(得分:0)
我刚刚读过http://www.ross.net/crc/download/crc_v3.txt,并注意到在第9节中,提到了一个隐式前缀1以强制执行所需的多项式宽度。
在我的示例情况下,这意味着用作除数的 actual 多项式将不是0x1021,而是0x11021。这样会导致前导“ 1”被删除,其余部分则是“预定”的16位多项式:
1 0000 0000 0000 0000 (zero padded value)
(XOR) 1 0001 0000 0010 0001
-----------------
0 0001 0000 0010 0001 = 0x1021