Boost Gzip解压缩字节数组

10

我按照Boost网站上的示例实现了文件的gzip/zlib解压缩。

void CompressionUtils::Inflate(std::ifstream& inputFile,
                               std::ofstream& outputFile)
{
   boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
   in.push(boost::iostreams::gzip_decompressor());
   in.push(inputFile);
   boost::iostreams::copy(in, outputFile);
}

这个工作得很好。我还从一个基于rest的JSON服务获取压缩数据,并通过套接字读取该数据。我想写一个基于内存的实现,认为这不难。但是,我发现自己没有像应该那样理解流和流缓冲区。得怪我过去几年都在用Java ;)...所以我开始研究这方面的知识。

void CompressionUtils::Inflate(char* compressed, 
                               int size,
                               char* decompressed)
{

   boost::iostreams::stream<boost::iostreams::array_source> source(compressed,size);
   //std::stringstream str;

   boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
   in.push(boost::iostreams::gzip_decompressor());
   in.push(source);
   //boost::iostreams::copy(in, str);   
}

但是我不知道可以使用哪种流来获取解压缩后的char*表示形式。这应该很简单,也可能是,但是我已经浪费了最近几个小时,试图进行无成功尝试。

1个回答

8

显然,你已经遇到过流和流缓冲的过滤。你可以使用同样的方法来反向获取数据并存储到字符串中。

我没有现成的示例,所以这只是一些伪代码,但应该是你要找的:

namespace io = boost::iostreams; //<-- good practice
typedef std::vector<char> buffer_t;

void CompressionUtils::Inflate(const buffer_t &compressed,
                               buffer_t &decompressed)
{
    io::filtering_ostream os;

    os.push(io::gzip_decompressor());
    os.push(io::back_inserter(decompressed));

    io::write(os, &compressed[0], compressed.size());
}

所以你可以使用Boost提供的后插器。以上代码的基本功能是定义一个输出流,你可以向其中写入内容。它被设置为所有写入其中的内容都将首先由gzip解压缩,然后附加到back_inserter中,而back_inserters则会插入到decompressed缓冲区的末尾。同时,正如你所看到的,这些缓冲区都被封装在std :: vector中。如果这对你有用,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接