阅读 zlib 档案列表

Read list of zlib archives

我有一个文件本身包含许多 zlib 档案。 文件结构如下:

+-------------------------+
|+-----------------------+|
||     CMF+FLG (78DA)    ||
|+-----------------------+|
|+-----------------------+|
||...compressed data 1...||
|+-----------------------+|
|+-----------------------+|
||        ADLER32        ||
|+-----------------------+|
|
|+-----------------------+|
||     CMF+FLG (78DA)    ||
|+-----------------------+|
|+-----------------------+|
||...compressed data 2...||
|+-----------------------+|
|+-----------------------+|
||        ADLER32        ||
|+-----------------------+|
|
|+-----------------------+|
||     CMF+FLG (78DA)    ||
|+-----------------------+|
|+-----------------------+|
||...compressed data 3...||
|+-----------------------+|
|+-----------------------+|
||        ADLER32        ||
|+-----------------------+|
|                         |
|.........................|
|                         |
|+-----------------------+|
||     CMF+FLG (78DA)    ||
|+-----------------------+|
|+-----------------------+|
||...compressed data n...||
|+-----------------------+|
|+-----------------------+|
||        ADLER32        ||
|+-----------------------+|
+-------------------------+

我需要遍历所有这些存档并提取它们。 我尝试了以下代码,但这仅从文件中提取了第一个存档。

for filename in sys.argv[1:]:
    with open(filename, 'r') as compressed:
        with open(filename + '-decompressed', 'w') as expanded:
            data = zlib.decompress(compressed.read())
            expanded.write(data)

你应该可以像这样使用一系列的解压对象:

import zlib

with open(filename, 'rb') as compressed:
    data = compressed.read()
    file_no = 0

    while data:
        d = zlib.decompressobj()
        with open('{}_decompressed.{}'.format(filename, file_no), 'wb') as f:
            f.write(d.decompress(data))
        data = d.unused_data
        file_no += 1

这将获取包含多个串联 zlib 压缩文件的单个文件,并将每个文件解压缩为单独的文件,并在原始文件名后附加 "_decompressed.n"

关键是利用解压对象的unused_data属性判断字符串中是否还有未压缩的数据