Python zlib 解压缩错误

0 投票
2 回答
7319 浏览
提问于 2025-04-16 22:27

我正在尝试用Python解压一个用zlib压缩的文件,代码如下:

import zlib

data = open("3B42.110531.21.6A.HDF.Z", 'rb').read()
inflated = zlib.decompress(data)
f = open('3B42.110531.21.6A.HDF', 'wb')
f.write(inflated)
f.close()

我已经尝试了几种不同的方法:

  • zlib.decompress加一个第二个参数,比如zlib.decompress(data, -15)
  • 跳过前两个字节,比如zlib.decompress(data[2:-4])或者zlib.decompress(data[2:])
  • 进行64位的Base编码。

但是我还是失败了,收到这个错误信息:

    Traceback (most recent call last):
  File "C:\opt\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 325, in RunScript
    exec codeObject in __main__.__dict__
  File "E:\Tesis\data\uncompress.py", line 6, in <module>
    inflated = zlib.decompress(data)
error: Error -3 while decompressing data: incorrect header check

唯一的不同是使用了zlib.decompress的负参数:无效的块类型。

import zlib

data = open("3B42.110531.21.6A.HDF.Z", 'rb').read()
inflated = zlib.decompress(data,-15)
f = open('3B42.110531.21.6A.HDF', 'wb')
f.write(inflated)
f.close()


Traceback (most recent call last):
  File "C:\opt\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 325, in RunScript
    exec codeObject in __main__.__dict__
  File "E:\Tesis\data\uncompress.py", line 6, in <module>
    inflated = zlib.decompress(data,-15)
error: Error -3 while decompressing data: invalid block type

我确定文件没有损坏,因为我可以用WinRAR打开它。(环境:Windows x64,Python 2.5,我猜这个文件是在Unix机器上下载的二进制文件)

我已经阅读了以下链接:

2 个回答

1

文件扩展名 '.Z' 以及你尝试过的操作听起来像是你可能用错了 zLib(不过根据你提供的链接来看,使用方法似乎是对的),或者是文件开头的 zLib 流不太对。

你可以使用我的工具 Precomp 来检测文件中 zLib 流的位置:

precomp -v -slow 3B42.110531.21.6A.HDF.Z

它应该会输出类似这样的内容:

Possible zLib-Stream (slow mode) found at position 85, windowbits = 15
Can be decompressed to 9264 bytes

这会告诉你流的位置以及需要使用的 windowbits 参数(取反后)。

它还会告诉你文件中是否真的有 zLib 流,因为正如 phihag 所说,文件可能是用不同于 deflate/zLib 的方式压缩的。需要注意的是,在这种情况下,可能会出现一些误判,因为 zLib 的头部只有 2 个字节,但这些可以通过解压缩到小于 100 字节来识别。

2

.Z表示一种叫做 LZC 或者 compress 的文件格式。虽然名字听起来相似,但这种压缩格式和 gzip 是不一样的,后者是 zlib 实现的。

你可以试试使用命令行中的 compress 工具来解压这个文件(你的 gzip 程序也可能能解压它)。

撰写回答