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

标签 algorithm crc calculation crc16

在测试 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”被丢弃,余数是“预期的”16 位多项式:

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

关于algorithm - 为什么 "1"的 CRC 会产生生成多项式本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52689764/

相关文章:

algorithm - 我如何评估节点的连通性?

algorithm - 为什么 gzip 使用 CRC 而不是一般的哈希算法?

c - 用于在引导加载程序应用程序中计算 crc 的软件逻辑

JavaScript 计算无法启动/未正确执行

php - 如何在 WC_Shipping_Methodcalculate_shipping() 方法中获取购物车小计

performance - 用于确定列的任何两个子集是否具有相同总和的快速代码

algorithm - O(n) 中的 Frechet 距离

algorithm - 适用于事件日历应用程序的最佳数据结构

c# - 将 Modbus RTU CRC 从 C# 移植到 python

python - 参数内的计算