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解压那个格式直接用
我创建了一个解码器,主要用于从通过 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解压那个格式直接用