我正在编写一个 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 实现的代码,但没有找到任何线索说明为什么会这样。