Compression
如何在 UNIX 中解壓縮 zlib 數據?
我在 Python 中創建了 zlib 壓縮數據,如下所示:
import zlib s = '...' z = zlib.compress(s) with open('/tmp/data', 'w') as f: f.write(z)
(或外殼中的單線
echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
:)現在,我想解壓縮 shell 中的數據。既不
zcat
也不uncompress
工作:$ 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 數據的實用程序?
如果您沒有或想要使用openssl或其他工具,也可以使用標準shell-script + gzip對其進行解壓縮。訣竅是將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 的 Q提供了有關這種方法的更多資訊。那裡的答案表明還有一個 8 字節的頁腳。
使用者 @Vitali-Kushner 和 @mark-bessey 報告說即使文件被截斷也能成功,因此似乎並不嚴格要求 gzip 頁腳。
@tobias-kienzler 為bashrc建議了這個函式:
zlibd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - "$@" | gzip -dc)