c++ boost gzip内存二进制压缩
c++ boost gzip in-memory binary compression
我试图压缩数据在一个数组使用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(不能保证压缩更多,但可能会使用更多的时间和内存)。
我不认为在这种情况下文本和二进制应该有区别。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- C++中高效的大型稀疏块压缩线性方程
- 嵌入方指针压缩已禁用
- C++使用整数的压缩数组初始化对象
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 在C++中将函数压缩为两种方式
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将二进制数据写入压缩文件
- 霍夫曼压缩读取文件不会复制二进制文件c++中的所有字节
- 作为二进制压缩为无符号整数的无符号整数半字节
- 在C++中读取压缩的二进制文件
- 压缩二进制文件
- c++ boost gzip内存二进制压缩
- 读取和Huffman压缩4字节二进制字符串STD C++Linux环境
- LZ4解压缩未知大小的二进制内存块