Python如何获取用zlib压缩的数据的长度?

2024-01-07

我有一个包含多个 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(使用前将#替换为@)

Python如何获取用zlib压缩的数据的长度? 的相关文章

随机推荐