使用Boost gzip_decompressor解压缩内存中的数据

时间:2013-05-22 02:51:11

标签: c++ boost compression

我正在尝试使用Boost gzip_decompressor解压缩内存中的二进制数据。从this answer开始,我修改了以下代码:

vector<char> unzip(const vector<char> compressed)
{
    vector<char> decompressed = vector<char>();

    boost::iostreams::filtering_ostream os;

    os.push(boost::iostreams::gzip_decompressor());
    os.push(boost::iostreams::back_inserter(decompressed));

    boost::iostreams::write(os, &compressed[0], compressed.size());

    return decompressed;
}

但是,返回的向量长度为​​零。我究竟做错了什么?我尝试在os流上调用flush(),但它没有什么区别

1 个答案:

答案 0 :(得分:3)

您的代码适用于我这个简单的测试程序:

#include <iostream>
#include <vector>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>

std::vector<char> unzip(const std::vector<char> compressed)
{
   std::vector<char> decompressed = std::vector<char>();

   boost::iostreams::filtering_ostream os;

   os.push(boost::iostreams::gzip_decompressor());
   os.push(boost::iostreams::back_inserter(decompressed));

   boost::iostreams::write(os, &compressed[0], compressed.size());

   return decompressed;
}

int main() {
   std::vector<char> compressed;
   {
      boost::iostreams::filtering_ostream os;
      os.push(boost::iostreams::gzip_compressor());
      os.push(boost::iostreams::back_inserter(compressed));
      os << "hello\n";
      os.reset();
   }
   std::cout << "Compressed size: " << compressed.size() << '\n';

   const std::vector<char> decompressed = unzip(compressed);
   std::cout << std::string(decompressed.begin(), decompressed.end());

   return 0;
}

你确定你的输入是用gzip压缩而不是其他方法(例如raw deflate)吗? gzip压缩数据以字节1f 8b开头。

我通常使用reset()或将流和过滤器放在他们自己的块中以确保输出完成。作为一个例子,我在上面进行了压缩。