0

我正在尝试使用 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标记的字符串流作为输入,并为调用该read()函数的字符串流创建一个接收器。这没有用。

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

4

1 回答 1

0

我正在看这条线:

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

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

于 2013-03-12T01:35:44.000 回答