boost :: iostreams :: zlib :: default_noheader似乎被忽略了

时间:2010-07-14 17:31:54

标签: c++ zlib decoding boost-iostreams text-decoding

我无法获得boost :: iostreams的zlib过滤器以忽略gzip标头...似乎将zlib_param的default_noheader设置为true然后调用zlib_decompressor()会产生'data_error'错误(错误的标头检查)。这告诉我zlib仍然期待找到标题。 有没有人得到boost :: iostreams :: zlib来解压缩没有标题的数据?我需要能够读取和解压缩没有双字节头的文件/流。任何帮助将不胜感激。

以下是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();它被成功解压缩......所以我很困惑为什么这不起作用。

提前致谢。

-ICE

3 个答案:

答案 0 :(得分:0)

我认为您想要做的是here所描述的调整window bits参数的内容。

e.g

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

in.push(zlib_decompressor(p));
in.push(ifs);
我认为

MAX_WBITS在zlib.h中定义。

答案 1 :(得分: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而不是文件

答案 2 :(得分:0)

只需使用boost::iostreams::gzip_decompressor解压缩gzip文件。

例如:

#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>

// ...

boost::iostreams::filtering_istream stream;
stream.push(boost::iostreams::gzip_decompressor());
ifstream file(filename, std::ios_base::in | std::ios_base::binary);
stream.push(file);