【问题标题】:c++ boost gzip in-memory binary compressionc++ boost gzip 内存中二进制压缩
【发布时间】:2013-03-11 23:48:07
【问题描述】:

我正在尝试使用 boost iostream 和 gzip 压缩数组中的数据,这是我的代码:

struct String_sink  : public boost::iostreams::sink 
{
    std::string& s;
    String_sink(std::string& s):s(s){}
    std::streamsize write(const char* s, std::streamsize n) 
    {
        this->s.append(s, n);
        return n;
    }
};


boost::iostreams::stream< boost::iostreams::array_source > source ((char*)dataBitstream.GetData(), dataBitstream.GetNumberOfBytesUsed());
std::string compressed;
boost::iostreams::filtering_streambuf<boost::iostreams::input> outStream; 
outStream.push(boost::iostreams::gzip_compressor(1)); 
outStream.push(source); 
boost::iostreams::copy(outStream, String_sink(compressed));

虽然这会压缩数据,但它会将其作为文本进行。我希望它在 binary 中完成。原因是如果我使用 ios_base::binary 标志将“dataBitstream”保存到文件中,然后使用 gzip.exe 压缩文件,结果大小比我在代码中得到的小 50%。这两种情况我都使用“1”作为压缩级别。如果没有二进制标志,文件确实会压缩到与我在代码中看到的大小相同。

所以有人知道如何将数组压缩为二进制吗?到目前为止,我已经尝试使用std::stringstream::binary 标记的字符串流作为输入,并为调用read() 函数的字符串流创建一个接收器。这不起作用。

是否可以强制将数组压缩为二进制数据??

【问题讨论】:

    标签: c++ boost binary compression gzip


    【解决方案1】:

    我正在看这条线:

    outStream.push(boost::iostreams::gzip_compressor(1)); 
    

    并将其与我在 Google 上搜索到的与 Boost's gzip facilities 相关的文档进行比较。

    basic_gzip_compressor( const gzip_params& = zlib::default_compression, 
                           std::streamsize buffer_size = default value );
    

    因此,您将压缩值指定为 1。这是最低设置(即最小压缩量)。默认值(在普通 gzip.exe 命令行的情况下使用)是 5。尝试使用它,甚至是 9(不能保证压缩更多,但可能会使用更多时间和内存)。

    我不认为在这种情况下文本与二进制文件应该有所不同。

    【讨论】:

    • 我确实在我的代码和 gzip.exe 中都使用了压缩级别“1”,但遗憾的是事实并非如此。我确信将数据保存为二进制会有所作为。关键是“ofstream”的“ios_base::binary”标志。但是,此二进制标志不适用于“字符串流”。
    • 如果在这两种情况下都使用 5 或 9 会发生什么?差距还大吗?
    • 5和9有一些区别,但没有文件类型的区别那么大。我什至尝试使用ios_base::binary 将二进制文件读回代码中,令人惊讶的是它以更高的比率压缩(与 gzip.exe 相同)。但我需要这样做,而不必保存到磁盘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多