python zlib 在通过 Decompress() 对象扩充数据时产生 -3 错误

python zlib produces a -3 error when inflating data through a Decompress() object

我创建了一个解码器,主要用于从通过 urllib2 类文件对象下载的 zlib 编码文件中解析、解压缩和提取单个文件。我的想法是使用尽可能少的内存和磁盘 space,所以我使用中间带有 "decoder" 的 reader / writer 模式来解压缩来自 urllib2 的数据,feed它进入 cpio 子进程,最后将文件数据写入磁盘:

with closing(builder.open()) as reader:
    with open(component, "w+b") as writer:
         decoder = Decoder()

         while True:
             data = reader.read(10240)
             if len(data) == 0:
                 break

             writer.write(decoder.decode(data))

        final = decoder.flush()
        if final is not None:
            writer.write(final)

        writer.flush()

解码器也很简单:

class Decoder(object):
    def __init__(self):
        self.__zcat = zlib.decompressobj()
        # cpio initialisation

    def decode(self, data_in):
        return self.__consume(self.__zcat.decompress(data_in))

    def __consume(self, zcat_data_in):
        # cpio operations
        return data_out

    def flush(self):
        return self.__consume(self.__zcat.flush())

我什至在任何东西被传递到 cpio 管道之前就看到了一个错误,所以为了清楚起见,我觉得在这里省略它是明智的。

有趣的是,为了验证数据实际上可以被 zlib 解压缩,我将传递给 decode() 的原始数据 data_in 写入标准输出:

def decode(self, data_in):
    sys.stdout.write(data_in)
    return self.__consume(self.__zcat.decompress(data_in))

然后运行:

$ bin/myprog.py 2>/dev/null | zcat - | file -
/dev/stdin: cpio archive

如您所见,zcat 对它在 stdin 上提供的数据非常满意,结果文件是一个 cpio 存档。但是zlib解压方法报:

error: Error -3 while decompressing: incorrect header check

\x1f\x9d 是旧 Unix 压缩格式的前两个字节。 zlib 不能帮你解压。 gzip 可以解压缩它只是为了与旧的压缩实用程序兼容。

你可以拉the code from pigz解压那个格式直接用