Python CRC-32问题

Lau*_*low 5 python crc32 bzip2

我正在编写一个Python程序,用于从6 GB bz2文件的中间提取数据.bzip2文件由独立可解密的数据块组成,所以我只需要找到一个块(它们由魔术位分隔),然后在内存中创建一个临时的一块bzip2文件,最后将其传递给bz2.decompress函数.容易,不是吗?

bzip2 格式最后有一个文件的crc32校验和.没问题,binascii.crc32来救援.可是等等.要校验和的数据不一定以字节边界结束,而crc32函数在整数个字节上运行.

我的计划:在除最后一个字节之外的所有字节上使用binascii.crc32函数,然后使用我自己的函数来更新最后1-7位的计算crc.但是数小时的编码和测试让我感到困惑,我的困惑可以归结为这个问题:为什么crc32("\ x00")不是0x00000000?根据维基百科的文章,它应该不是吗?

你从0b00000000开始,用32 0填充,然后用0x04C11DB7进行多项式除法,直到前8位没有剩下的,这是立即的.你的最后32位是校验和,怎么能不是全零?

我搜索了Google的答案并查看了几个CRC-32实现的代码,却没有找到任何关于为什么会这样做的线索.

Nay*_*uki 9

怎么来crc32("\ x00")不是0x00000000?

基本CRC算法是将输入消息视为GF(2)中的多项式,除以固定的CRC多项式,并使用多项式余数作为结果散列.

CRC-32对基本算法进行了一些修改:

  1. 消息的每个字节中的位被反转.例如,字节0x01被视为多项式x ^ 7,而不是多项式x ^ 0.
  2. 该消息在右侧填充32个零.
  3. 此反向和填充消息的前4个字节与0xFFFFFFFF进行异或.
  4. 余数多项式是相反的.
  5. 余数多项式与0xFFFFFFFF进行异或运算.
  6. 并且回想一下,非反转形式的CRC-32多项式是0x104C11DB7.

让我们计算出单字节字符串0x00的CRC-32:

  1. 消息:0x00
  2. 反转:0x00
  3. 填充:0x00 00 00 00 00
  4. 异或:0xFF FF FF FF 00
  5. 除以0x104C11DB7时的余数:0x4E 08 BF B4
  6. 异或:0xB1 F7 40 4B
  7. 反转:0xD2 02 EF 8D

你有它:0x00的CRC-32是0xD202EF8D.
(你应该验证这一点.)