有人可以告诉我需要使用哪个函数来解压缩已经使用vb.net的gzipstream压缩的字节数组。我想使用zlib。
我已经包含了zlib.h但是我无法弄清楚应该使用哪些函数。
答案 0 :(得分:7)
您可以查看The Boost Iostreams Library:
#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>()
);
答案 1 :(得分:1)
您需要使用inflateInit2()
来请求gzip解码。阅读zlib.h中的文档。
zlib distribution中有很多示例代码。另请查看this heavily documented example of zlib usage。您可以修改该版本以使用inflateInit2()
代替inflateInit()
。
答案 2 :(得分:0)
这是一个使用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)。上述功能仅在输出为文本时有效。我测试了它并且它有效。
答案 3 :(得分:-1)
查看zlib用法示例。 http://www.zlib.net/zpipe.c
执行实际工作的函数是inflate(),但是你需要inflateInit()等。