【问题标题】:How to calculate CRC32 correctly? [closed]如何正确计算CRC32? [关闭]
【发布时间】:2015-04-12 02:48:50
【问题描述】:
item = '04010034587C1F0C6D51B6D33B78CA63C1CC7E5910006C5600000000000000'
'%08X' % (binascii.crc32(binascii.a2b_hex(item)) & 0xffffffff)

我无法让 crc32 给我正确的 32 位。我尝试了几种不同的算法。我一直在使用此代码获得“3228F9E4”,但根据使用的另一个程序,正确的 crc32 应该是“E42FDBEC”。多项式为“04C11DB7”,初始余数为“00000000”。

如何正确计算?

【问题讨论】:

  • 您使用哪种方法来获得“正确”的 CRC,您如何假设它是正确的?
  • 我在尝试重现您的结果时遇到错误,TypeError: Odd-length string。您是否正确复制/粘贴?
  • 您的十六进制字符串有奇数个字符。 错了! 十六进制字节串必须有偶数个十六进制数字。您想要 CRC 的实际数据是什么? 究竟什么代码从什么输入产生E42FDBEC?您没有提供必要的信息来回答您的问题。
  • Something 产生了E42FDBEC。那是什么?
  • 我尝试了 192 种不同的 CRC 算法,使用字符串中的这 88 个十六进制,解码 44 个字节并按原样通过 CRC 进行十六进制,总共 1152 种组合,来自文件的假设行结尾等等,以及将它们与值及其字节交换版本进行匹配,但在其中任何一个中都找不到匹配项。

标签: python crc32


【解决方案1】:

一个特定的CRC impelmentation 由一个多项式、一个可选的初始值和一个可能的最终异或指定。位顺序也很重要。

binutils 文档说:

计算 CRC-32,即数据的 32 位校验和,从初始 crc 开始。这与 ZIP 文件校验和一致

确保您使用正确的初始值作为参考实现。 (crc32 的第二个参数)

【讨论】:

  • 我使用的多项式是'04C11DB7',初始余数是'00000000'。
  • 可能的最终异或应该是 FFFFFFFF....我还读到这个多项式有点常见...这怎么会这么难?...
  • 这很困难,因为 CRC-32 与其说是实现规范,不如说是一个概念。有多种方法可以实现它。多项式可能不是问题,问题在于如何将长字符串分解为字节以提供算法。
  • binascii.crc32(binascii.a2b_hex(item)) & 0xffffffff 在这种情况下是否不将 'item' 作为字符串?我想知道是否有人知道的另一种方式可以给我这个正确的输出:'E42FDBEC'