如何解压缩与zlib的gzipstream(How to decompress gzipstream

2019-07-19 06:07发布

谁能告诉我,我需要以解压缩已压缩与vb.net的gzipstream一个字节数组要使用的功能。 我想使用zlib。

我已经包括了zlib.h,但我一直没能找出什么功能(S)我应该使用。

Answer 1:

你可以看看了Boost Iostreams库 :

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

std::ifstream file;
file.exceptions(std::ios::failbit | std::ios::badbit);
file.open(filename, std::ios_base::in | std::ios_base::binary);

boost::iostreams::filtering_stream<boost::iostreams::input> decompressor;
decompressor.push(boost::iostreams::gzip_decompressor());
decompressor.push(file);

然后解压缩逐行:

for(std::string line; getline(decompressor, line);) {
    // decompressed a line
}

或整个文件到一个数组:

std::vector<char> data(
      std::istreambuf_iterator<char>(decompressor)
    , std::istreambuf_iterator<char>()
    );


Answer 2:

您需要使用inflateInit2()请求的gzip解码。 阅读文档zlib.h 。

有一个在很多示例代码zlib的分布 。 也看看zlib的本使用大量记载例子 。 您可以修改一个使用inflateInit2()代替inflateInit()



Answer 3:

下面是做这项工作与zlib的C函数:

int gzip_inflate(char *compr, int comprLen, char *uncompr, int uncomprLen)
{
    int err;
    z_stream d_stream; /* decompression stream */

    d_stream.zalloc = (alloc_func)0;
    d_stream.zfree = (free_func)0;
    d_stream.opaque = (voidpf)0;

    d_stream.next_in  = (unsigned char *)compr;
    d_stream.avail_in = comprLen;

    d_stream.next_out = (unsigned char *)uncompr;
    d_stream.avail_out = uncomprLen;

    err = inflateInit2(&d_stream, 16+MAX_WBITS);
    if (err != Z_OK) return err;

    while (err != Z_STREAM_END) err = inflate(&d_stream, Z_NO_FLUSH);

    err = inflateEnd(&d_stream);
    return err;
}

未压缩的字符串在uncompr返回。 这是一个空值终止的C字符串,所以你可以做的看跌期权(uncompr)。 如果输出是上面的文字只是功能工作。 我测试了它和它的作品。



Answer 4:

看看zlib的使用示例。 http://www.zlib.net/zpipe.c

,做真正的工作职能是膨胀(),但你需要inflateInit()等。



文章来源: How to decompress gzipstream with zlib