我正在尝试使用zlib的inflate解压缩从http数据包收到的一些数据。
数据包如下:
数据包本身表示它是用gzip编码的,所以我认为它应该可行。但是,当我通过inflate函数运行数据时,我得到“无效块类型”。要清楚,我只是将数据包的突出显示部分传递给inflate函数。我错过了什么?
以下是我用来解压缩数据的代码:
int Decompress(const u_char* strStreamIn, int nStreamInLen, u_char* strStreamOut)
{
int ret = -1;
int err = -1;
z_stream strm = {0};
strm.total_in = strm.avail_in = nStreamInLen;
strm.total_out = strm.avail_out = nStreamInLen * 6;
strm.next_in = (Bytef*) strStreamIn;
strm.next_out = (Bytef*) strStreamOut;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
err = inflateInit2(&strm, -MAX_WBITS);
if (err == Z_OK) {
err = inflate(&strm, Z_FINISH);
if (err == Z_STREAM_END) {
ret = strm.total_out;
}
else {
inflateEnd(&strm);
return err;
}
}
else {
inflateEnd(&strm);
return err;
}
inflateEnd(&strm);
return ret;
}
答案 0 :(得分:0)
是的,你需要使用inflateInit2()
和第二个参数作为31来请求gzip解压缩。如果你正在喂它1f 8b 08 00 ...
,那么你将不会得到“未知标题标志设置”。这绝不是你正在做的事情。
顺便说一句,它不会设置total_in
和total_out
,因为它们被inflateInit[2]()
设置为零。将它们设置为您在有效位置所做的值,例如在inflateInit
之后,也没有任何意义。
将avail_out
设置为输入大小的六倍是猜测,并不总是足够的。如果这还不够,那么Z_FINISH
会出错。您应该使用循环来根据需要多次调用inflate()
来处理输入并生成输出。
我建议您阅读zlib.h
,然后阅读how to use zlib。