Python CRC-32灾难
我正在编写一个Python程序,从6gbbz2文件的中间提取数据。bzip2文件由可独立解密的数据块组成,因此我只需要找到一个块(它们由魔术位分隔),然后从内存中创建一个临时的单块bzip2文件,最后将其传递给bz2.decompress函数。简单,不是吗 bzip2在文件末尾有一个crc32校验和。没问题,binascii.crc32去救援。但是等等。要校验和的数据不一定以字节边界结束,crc32函数以整数字节运行 我的计划是:在除最后一个字节外的所有字节上使用binascii.crc32函数,然后使用我自己的函数用最后1–7位更新计算出的crc。但是数小时的编码和测试让我感到困惑,我的困惑可以归结为这样一个问题:为什么crc32(“\x00”)不是0x00000000?根据维基百科的文章,难道不是吗 从0b00000000开始,用32个0填充,然后用0x04C11DB7进行多项式除法,直到前8位没有剩余的值,这将立即生效。最后32位是校验和,怎么可能不全是零呢Python CRC-32灾难,python,crc32,bzip2,Python,Crc32,Bzip2,我正在编写一个Python程序,从6gbbz2文件的中间提取数据。bzip2文件由可独立解密的数据块组成,因此我只需要找到一个块(它们由魔术位分隔),然后从内存中创建一个临时的单块bzip2文件,最后将其传递给bz2.decompress函数。简单,不是吗 bzip2在文件末尾有一个crc32校验和。没问题,binascii.crc32去救援。但是等等。要校验和的数据不一定以字节边界结束,crc32函数以整数字节运行 我的计划是:在除最后一个字节外的所有字节上使用binascii.crc32函数
我在谷歌上搜索了答案,并查看了几个CRC-32实现的代码,但没有找到任何线索说明原因。除了一次性的
解压
功能外,bz2模块还包含一个类BZ2Decompressor
,该类在数据输入解压方法时解压数据。因此,它不关心文件末尾的校验和,而是在到达块末尾时提供所需的数据
为了举例说明,假设我已经找到了我希望从文件中提取的块,并将其存储在一个实例中(其他位旋转模块可能也可以工作)。然后此函数将对其进行解码:
def bunzip2_block(block):
from bz2 import BZ2Decompressor
from bitarray import bitarray
dummy_file = bitarray(endian="big")
dummy_file.frombytes("BZh9")
dummy_file += block
decompressor = BZ2Decompressor()
return decompressor.decompress(dummy_file.tobytes())
请注意,bitarray的frombytes
和tobytes
方法以前被称为fromstring
和tostring
为什么crc32(“\x00”)不是0x00000000
基本的CRC算法是将输入消息视为GF(2)中的多项式,除以固定的CRC多项式,并使用多项式余数作为结果哈希
CRC-32对基本算法进行了许多修改:
(您应该对此进行验证。)这是否有帮助:不是直接的,不是,因为这涉及块校验和,而不是文件结束校验和。但是问题和更新以及答案都很有趣,很有启发性,所以谢谢你!你能更好地解释第五步的结果吗?0xFFFFFF00%0x104C11DB7不会导致0x4E08BFB4。我也不知道如何使用任何字节反转来获取它。它是。每一位代表一个单项式的系数。