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

Uncompress data in memory using Boost gzip_decompressor

本文关键字:内存 数据 Boost gzip decompressor 使用      更新时间:2023-10-16

我正在尝试使用Boost gzip_decompressor在内存中解压缩二进制数据。根据这个答案,我改编了以下代码:

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(),但它没有产生差异

您的代码为我工作与这个简单的测试程序:

#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 << "hellon";
      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()或将流和过滤器放在它们自己的块中以确保输出是完整的。我在上面的压缩中都做了,只是作为一个例子。