5

有人可以告诉我需要使用哪个函数来解压缩一个用 vb.net 的 gzipstream 压缩的字节数组。我想使用zlib。

我已经包含了 zlib.h,但我无法弄清楚我应该使用什么函数。

4

4 回答 4

9

您可以查看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>()
    );
于 2013-02-04T14:01:51.667 回答
1

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

zlib 发行版中有很多示例代码。还可以看看这个 zlib 使用的大量文档示例。您可以修改那个以使用inflateInit2()而不是inflateInit().

于 2013-02-04T17:32:24.240 回答
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 中返回。它是一个以 null 结尾的 C 字符串,因此您可以执行 puts(uncompr)。上述功能仅在输出为文本时才有效。我已经对其进行了测试,并且可以正常工作。

于 2017-09-07T22:29:02.183 回答
-1

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

真正起作用的函数是 inflate(),但你需要 inflateInit() 等。

于 2013-02-04T14:01:54.290 回答