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

c++ boost gzip in-memory binary compression

本文关键字:二进制 压缩 内存 gzip boost c++      更新时间:2023-10-16

我试图压缩数据在一个数组使用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));

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

所以谁知道如何压缩数组为二进制?到目前为止,我已经尝试使用std::stringstream::binary标记的stringstream作为输入,并为调用read()函数的stringstream创建一个sink。

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

我在看这一行:

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

并将其与我google的有关Boost的gzip工具的文档进行比较。

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

所以你指定的压缩值是1。这是最低设置(即,最少的压缩量)。默认值(对于普通的gzip.exe命令行使用)是5。尝试使用这个,甚至9(不能保证压缩更多,但可能会使用更多的时间和内存)。

我不认为在这种情况下文本和二进制应该有区别。