c ++ boost gzip内存中的二进制压缩

时间:2013-03-11 23:48:08

标签: c++ boost binary compression gzip

我正在尝试使用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));

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

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

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

1 个答案:

答案 0 :(得分:0)

我正在看这一行:

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(不保证压缩更多但可能使用更多时间和内存)。

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