我有一个包含多个 zlib 压缩的二进制数据的文件,并且偏移量和长度未知。下面,我有一个脚本,用于获取最终 zlib 压缩数据之后的字节偏移量,这就是我所需要的。脚本有效;但是,为了获得原始 zlib 压缩数据的长度,我必须将其解压缩并重新压缩。有没有更好的方法来获取长度而不必重新压缩它?这是我的代码:
import zlib
def inflate(infile):
data = infile.read()
offset = 0
while offset < len(data):
window = data[offset : offset + 2]
for key, value in zlib_headers.items():
if window == key:
decomp_obj = zlib.decompressobj()
yield key, offset, decomp_obj.decompress(data[offset:])
if offset == len(data):
break
offset += 1
if __name__ == "__main__":
zlib_headers = {b"\x78\x01": 3, b"\x78\x9c": 6, b"\x78\xda": 9}
with open("input_file", "rb") as infile:
*_, last = inflate(infile)
key, offset, data = last
start_offset = offset + len(zlib.compress(data, zlib_headers[key]))
print(start_offset)
重新压缩它甚至不起作用。重新压缩的长度可能不同。无法保证结果会相同,除非您首先控制生成压缩数据的压缩过程,并且您可以保证它使用相同的压缩代码、该代码的相同版本以及完全相同设置。 zlib 标头中甚至没有足够的信息来确定压缩级别。顺便说一句,您可能的 zlib 标头列表不完整。可能还有其他 29 个。确定 zlib 流是否从当前字节开始的最简单、最可靠的方法是开始解压缩,直到出现错误或解压缩完成。解压缩器要做的第一件事是检查 zlib 标头的有效性。
要查找解压数据的长度,请输入decomp_obj.decompress()
一次固定数量的字节。例如。 65536 字节。跟踪您输入了多少字节。停止时decomp_obj.eof
是真的。这表明已到达 zlib 流的末尾。然后decomp_obj.unused_data
将是您在 zlib 流之后输入的字节。从喂入的总量中减去剩余部分的长度,就得到了 zlib 流的长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)