2

boost::iostreams の zlib フィルターで gzip ヘッダーを無視するのに問題があります... zlib_param の default_noheader を true に設定してから zlib_decompressor() を呼び出すと、「data_error」エラー (ヘッダー チェックが正しくない) が発生するようです。これは、zlib がまだヘッダーを見つけることを期待していることを示しています。ヘッダーなしでデータを解凍するために boost::iostreams::zlib を入手した人はいますか? 2 バイトのヘッダーを持たないファイル/ストリームを読み取って解凍できる必要があります。どんな援助でも大歓迎です。

これは、boost::iostreams::zlib ドキュメントで提供されているサンプル プログラムの修正版です。

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main(int argc, char** argv)
{
    using namespace std;
    using namespace boost::iostreams;

    ifstream ifs(argv[1]);
    ofstream ofs("out");
    boost::iostreams::filtering_istreambuf in;
    zlib_params p(
            zlib::default_compression,
            zlib::deflated,
            zlib::default_window_bits,
            zlib::default_mem_level,
            zlib::default_strategy,
            true
    );

    try
    {
        in.push(zlib_decompressor(p));
        in.push(ifs);
        boost::iostreams::copy(in, ofs);
        ofs.close();
        ifs.close();
    }
    catch(zlib_error& e)
    {
        cout << "zlib_error num: " << e.error() << endl;
    }
    return 0;
}

テスト データに問題がないことはわかっています。テストファイルで gzread() を呼び出す小さなプログラムを作成しました。正常に解凍されました...なぜこれが機能しないのか混乱しています。

前もって感謝します。

-氷

4

3 に答える 3

1

あなたがやりたいことは、ここで説明されているパラメーターを調整することだと思いwindow bitsます。

例えば

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

in.push(zlib_decompressor(p));
in.push(ifs);

MAX_WBITSzlib.h で定義されていると思います。

于 2010-08-08T15:58:45.930 に答える
0

非常に簡単です、これを試してください:

FILE* fp = fopen("abc.gz", "w+");
int dupfd = dup( fileno( fp ) );
int zfp = gzdopen( dupfd, "ab" )
gzwrite( zfp, YOUR_DATA, YOUR_DATA_LEN );
gzclose( zfp );
fclose( fp );

zlib とリンクし、zlib.h をインクルード fileno( stdout ) を使用して、ファイルの代わりに STDOUT を使用できます。

于 2010-09-23T09:15:56.267 に答える