UNIXでzlibデータを解凍するには?

UNIXでzlibデータを解凍するには?

次のようにPythonでzlib圧縮データを作成しました。

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

(またはシェルの1行echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data:)

では、シェルからデータを解凍したいと思います。動作しませ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データを解凍するユーティリティはありますか?

ベストアンサー1

標準を使用して解凍することもできます。+、持っていない、または使用したい場合または他のツール。
秘訣はあらかじめ追加することだ。gzip マジックナンバーと圧縮方法実際のデータソースzlib.compress:

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

編集:
@ d0sbootsコメント:RAW Deflateデータの場合は、nullバイトを2つ追加する必要があります。
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

SOに関するこの質問この方法の詳細を確認できます。それに対する答えは、8バイトのフッターもあることを示します。

@Vitali-Kushnerと@mark-besseyのユーザーは、ファイルが切り捨てられても成功を報告するため、gzipフッターは厳密には要求されないようです。

@tobias-kienzlerはこの機能の使用を提案しました。:
zlibd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - "$@" | gzip -dc)

おすすめ記事