次のように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
:)
では、シェルからデータを解凍したいと思います。動作しませ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データを解凍するユーティリティはありますか?
ベストアンサー1
標準を使用して解凍することもできます。シェルスクリプト+アーカイブ、持っていない、または使用したい場合OpenSSLまたは他のツール。
秘訣はあらかじめ追加することだ。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はこの機能の使用を提案しました。bashrc:
zlibd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - "$@" | gzip -dc)