【问题标题】:boost::iostreams::zlib::default_noheader seems to be ignoredboost::iostreams::zlib::default_noheader 似乎被忽略了
【发布时间】:2010-07-14 17:31:53
【问题描述】:

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

提前致谢。

-冰

【问题讨论】:

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


    【解决方案1】:

    我认为您想要做的是here 中描述的事情,即调整window bits 参数。

    例如

    zlib_params p;
    p.window_bits = 16 + MAX_WBITS;
    
    in.push(zlib_decompressor(p));
    in.push(ifs);
    

    MAX_WBITS 我认为是在 zlib.h 中定义的。

    【讨论】:

      【解决方案2】:

      很简单,试试这个:

      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 而不是文件

      【讨论】:

        【解决方案3】:

        只需使用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);
        

        【讨论】:

          猜你喜欢
          • 2021-10-28
          • 2016-09-30
          • 2012-03-11
          • 1970-01-01
          • 1970-01-01
          • 2017-12-05
          • 2012-03-08
          • 2015-12-11
          • 2014-04-15
          相关资源
          最近更新 更多