zlib を使用して gzip ストリームを解凍するにはどうすればよいですか?
質問
Gzip 形式ファイル ( gzip
たとえば、プログラムでは、「deflate」圧縮アルゴリズムを使用します。これは、次の圧縮アルゴリズムと同じです。 ズリブ を使用します。ただし、zlib を使用して gzip 圧縮ファイルをインフレートすると、ライブラリは Z_DATA_ERROR
.
zlib を使用して gzip ファイルを解凍するにはどうすればよいですか?
解決
このように、inflateInit2
としてwindowBits
パラメータで16+MAX_WBITS
を呼び出して、zlibのでgzip形式のファイルを解凍するには:
inflateInit2(&stream, 16+MAX_WBITS);
これを行わない場合は、、zlibのは悪いストリーム形式文句を言うでしょう。デフォルトでは、zlibのはzlibのヘッダーをストリーム作成し、あなたがそれを教えてくれない限り、インフレートに異なるgzipヘッダを認識しません。これはzlib.h
ヘッダファイルのバージョン1.2.1以降で記載されているが、それは ZLIBマニュアルにありませんに。ヘッダファイルから:
windowBits
は、オプションGZIP復号化のための15よりも大きくすることができます。追加 自動ヘッダとZLIBおよびGZIP復号化を可能にするためにwindowBits
32 検出、またはだけgzip形式をデコードするために16を追加する(ZLIB形式であろう )Z_DATA_ERROR
を返します。 GZIPストリームがデコードされている場合は、strm->adler
です 代わりにAdler32チェックのCRC32ます。
他のヒント
パイソン
ニシキヘビ zlib
モジュールもこれらをサポートします。
ウィンドウビットの選択
しかし zlib
これらすべての形式を解凍できます。
- 圧縮(解凍)する
deflate
フォーマット、使用wbits = -zlib.MAX_WBITS
- 圧縮(解凍)する
zlib
フォーマット、使用wbits = zlib.MAX_WBITS
- 圧縮(解凍)する
gzip
フォーマット、使用wbits = zlib.MAX_WBITS | 16
のドキュメントを参照してください。 http://www.zlib.net/manual.html#Advanced (セクション inflateInit2
)
例
テストデータ:
>>> deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
>>> zlib_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS)
>>> gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16)
>>>
>>> text = '''test'''
>>> deflate_data = deflate_compress.compress(text) + deflate_compress.flush()
>>> zlib_data = zlib_compress.compress(text) + zlib_compress.flush()
>>> gzip_data = gzip_compress.compress(text) + gzip_compress.flush()
>>>
~に対する明白なテスト zlib
:
>>> zlib.decompress(zlib_data)
'test'
のテスト deflate
:
>>> zlib.decompress(deflate_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(deflate_data, -zlib.MAX_WBITS)
'test'
のテスト gzip
:
>>> zlib.decompress(gzip_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|16)
'test'
データも互換性があります gzip
モジュール:
>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()
自動ヘッダー検出 (zlib または gzip)
追加する 32
に windowBits
ヘッダー検出をトリガーします
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
'test'
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
'test'
を使用して gzip
その代わり
のために gzip
使用できる gzip ヘッダー付きのデータ gzip
モジュールを直接;しかし ボンネットの下でそれを覚えておいてください, gzip
用途 zlib
.
fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
Node.js
const { gunzip } = require('zlib');
const decompressGzip = compressedData =>
new Promise((resolve, reject) => {
gunzip(compressedData, (error, decompressedData) => {
if (error) return reject(error);
return resolve(decompressedData);
});
});
module.exports = { decompressGzip };
あなたがインストールします zlib
糸を使って
yarn add zlib