1

現在、 zlibを使用してgzip 圧縮されたデータのソースを膨らませようとしています。

zlib の inflate API は gzip 圧縮されたデータを膨張できないようです (例http://www.zlib.net/zpipe.c fails to read a gzipped file: "zpipe: invalid or incomplete deflate data" )。この API にはgzopen関数があることに気付きましたが、私の知る限り、ファイル名またはファイル記述子でしか機能しません。

gzip 圧縮されたデータのソースがメモリ、SQL BLOB などに保存されている場合、この API を使用できますか?

どうもありがとう

ピエール

4

4 に答える 4

2

関数を使用してメモリ位置をファイルとして開き、fmemopenそのファイル記述子を gzopen 関数に渡すことができます。

于 2012-12-12T15:50:00.017 に答える
1

gzip 形式は、単純なヘッダー (およびトレーラー) を zlib 圧縮ストリームに追加するだけです。ヘッダーをスキップすることは難しくありません。フォーマットはRFC 1952に文書化されています。

于 2010-06-13T20:10:08.940 に答える
0

別の解決策としてgzdopen、ファイル記述子を取る - があります。でメモリを読み取るものを入手できますpipe()。その後、何らかの形式のノンブロッキング ファイル記述子、または補助スレッドを使用してデータを読み取ることができます。

これは価値があるというよりも、より多くの問題を抱えていることに気付くかもしれません。

于 2010-06-13T20:26:56.733 に答える
0

zlib.h には、メモリ内のデータ バッファーを解凍/圧縮するための API があります。inflateInit2() を使用すると、windowBits の推奨値 15 に 16 を加算して、gzip 圧縮されたデータ バッファーを解凍できます。残念ながら、8 バイトの gzip トレーラー (4 バイトの Fletcher-32 CRC、4 バイトの解凍データ サイズ) から予想される解凍バイト数を読み取るための API はありません。inflate() が Z_BUF_ERROR (渡された出力バッファーに十分なスペースがない) を返した場合は、自分でそれを行うか、推測してから出力バッファーのサイズを変更する必要があると私が言える限りでは。入力バッファ全体がメモリ内にある場合は、Z_FINISH フラッシュ フラグを使用して inflate() を実行します。十分な出力メモリがある場合は Z_STREAM_END が返され、そうでない場合は Z_BUF_ERROR が返され、出力バッファを再割り当てして続行できます。

于 2014-01-14T19:55:03.977 に答える