他のzlibバージョン(1.2.7)
inflateInit2()がコメント化されている理由がわかりません。あなたは次の操作を行うことができinflateInit2を呼び出さずに
:
err = inflateInit(&d_stream);
err = inflateReset2(&d_stream, 31);
inflateReset2もinflateInitによって呼び出されます。 inflateInitの内部では、WindowBitsは15(1111バイナリ)に設定されています。しかし、gzipを動作させるには、それらを31(11111)に設定する必要があります。
理由はここにある:
inflateReset2の内部以下が行われる:ウィンドウビットは15(1111バイナリ)に設定されている場合、図2に窓ビットが設定されていれば1をもたらす
wrap = (windowBits >> 4) + 1;
今、あなたはHEAD状態で次の行は、GZIP
if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
01のためのマジックナンバーとともに状態 - >ラップ値をチェック)(膨らまを呼び出した場合31(11111)
私は、メモリ内のgzip圧縮解除を行うことができた次のコードで
ので: (注:このコードは、完全なデータが解凍されることを前提とし、メモリ内にあり、解凍されたデータのバッファが十分な大きさであること)
int err;
z_stream d_stream; // decompression stream
d_stream.zalloc = (alloc_func)0;
d_stream.zfree = (free_func)0;
d_stream.opaque = (voidpf)0;
d_stream.next_in = deflated; // where deflated is a pointer the the compressed data buffer
d_stream.avail_in = deflatedLen; // where deflatedLen is the length of the compressed data
d_stream.next_out = inflated; // where inflated is a pointer to the resulting uncompressed data buffer
d_stream.avail_out = inflatedLen; // where inflatedLen is the size of the uncompressed data buffer
err = inflateInit(&d_stream);
err = inflateReset2(&d_stream, 31);
err = inflateEnd(&d_stream);
inflateInit2()のコメントはoderソリューションです。ここで直接WindowBitsを設定することができます
バージョン1.1.3を使用する特別な理由はありますか?バージョン1.1.4は2002年3月に、最新バージョンは1.2.5になりました。 – ruakh
私が使用しているバージョンはかなり古いと思いますが、これはzlibのアップデートを許可しないレガシープロジェクトです。 – gmletzkojr