我正在尝试使用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()
函数的接收器。这没用。
是否可以强制将数组压缩为二进制数据?
答案 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(不保证压缩更多但可能使用更多时间和内存)。
在这种情况下,我不认为文本与二进制应该有所不同。