为什么“1”的 CRC 会产生生成多项式本身?

Why does the CRC of "1" yield the generator polynomial itself?

在测试 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,我可以看出高位离开移位寄存器与生成多项式的异或步骤将如何导致这个结果。我没有明白为什么这一步是以那种方式执行的,因为它明显改变了真正的多项式除法的结果?

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

在我的示例中,这意味着用作除数的 实际 多项式不是 0x1021,而是 0x11021。这导致删除前导“1”,余数为 "intended" 16 位多项式:

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