C++ gunzip

梦想与她 提交于 2020-05-04 14:29:34

boost gzip解压缩字节数组 我实现了文件的gzip / zlib解压缩,如其boost示例站点上的示例所示。

void CompressionUtils::Inflate(std::ifstream& inputFile, std::ofstream& outputFile) { boost::iostreams::filtering_streambufboost::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::streamboost::iostreams::array_source source(compressed,size); //std::stringstream str;

boost::iostreams::filtering_streambufboost::iostreams::input in; in.push(boost::iostreams::gzip_decompressor()); in.push(source); //boost::iostreams::copy(in, str);
} 但是我不知道什么样的流可以用来获得解压缩流的解压缩char*表示。 这应该很容易,很可能是,但是我一直在浪费最近几个小时来尝试失败。

c++ boost gzip zlib boost-iostreams author: 编辑此提问 采纳答案: 显然,你遇到过滤流和流缓冲区 。 您可以使用相同的方法将数据转换为字符串。

我没有我自己的例子,所以认为这是有点伪代码,但这应该是你要找的东西:

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_inserter插入到decompressed缓冲区的后面。

另外,正如你所看到的,缓冲区被包装在std::vector 。 让我知道这是否适合你。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!