如何使用zlib解压缩gzipstream

5

有人可以告诉我应该使用哪个函数来解压已使用vb.net的gzipstream压缩的字节数组吗?我想使用zlib。

我已经包含了zlib.h文件,但是我还没有找出应该使用哪个函数。

4个回答

8
您可以查看Boost Iostreams库,该库与IT技术有关。
#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>()
    );

谢谢,我该如何使用存储在char *中的字节数组来实现这个? - Lotzki
@Lotzki 请参考“将整个文件读入数组”的示例。 - Maxim Egorushkin
@Lotzki 如果您不确定什么是vector,请查看http://en.cppreference.com/w/cpp/container/vector - Maxim Egorushkin

1
这是一个使用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字符串,所以你可以用puts(uncompr)输出。上面的函数仅适用于输出为文本的情况。我已经测试过它,它能正常工作。

嗨,我想知道参数uncompruncomprLen是否在gzip_inflate方法中预先知道或修改?如何预先知道未压缩流的长度?谢谢。 - user7256215

1

我已经试图理解文档好几个小时了...我就是不明白。在vb.net中只用了10分钟,我不知道为什么这一个会让我遇到这么多麻烦。 我该如何将我的char *转换为正确的流以调用inflateInit2()?并且如何将输出作为char *获取?难道没有任何简单的示例代码吗? - Lotzki
你不需要转换任何东西。 - Mark Adler

-1

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