如何在UNIX中解压缩zlib数据?

Modified on: Sat, 30 Jun 2018 10:10:30 +0800

我在Python中创建了zlib压缩数据,如下所示:

import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
    f.write(z)

(或shell中的一行代码:echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data

现在,我想解压缩shell中的数据。 zcatuncompress都不工作:

$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format

$ zcat /tmp/data 
gzip: /tmp/data.gz: not in gzip format

$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format

似乎我创建了类似gzip的文件,但没有任何标题。不幸的是,我没有看到任何选项在gzip手册页中解压缩这样的原始数据,并且zlib包不包含任何可执行的实用程序。

是否有解压缩原始zlib数据的实用程序?

最佳答案

也可以使用标准shell-script + gzip,如果您没有,或想要使用openssl或其他工具。
诀窍是前缀gzip幻数和压缩方法来自zlib.compress的实际数据:

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out

编辑:
@ d0sboots注释:对于RAW Deflate数据,您需要再添加2个空字节:
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

这个关于SO的问题提供了有关此方法的更多信息。这里的答案表明还有一个8字节的页脚。

用户@ Vitali-Kushner和@ mark-bessey即使使用截断文件也报告成功,因此似乎并不严格要求使用gzip页脚。

@ tobias-kienzler为bashrc中
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)


相关问答

添加新评论