gzip 解压

场景:http gzip 解压解决思路

http gzip 解压
本帖最后由 wqz521nh 于 2014-05-29 16:22:14 编辑
在ubuntu下,利用libpcap去抓http包 然后分析得到网页标题。
得到数据包内容 解析,现在 遇到问题 ,
根据数据包里 Content-Encoding:gzip得出
需要解压数据。

以下从网上得到的解压http gzip代码

/* HTTP gzip decompress */
/* zdata 数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */
int httpgzdecompress(Byte *zdata, uLong nzdata,
Byte *data, uLong *ndata)
{
int err = 0;
z_stream d_stream = {0}; /* decompression stream */
static char dummy_head[2] = {
0x8 + 0x7 * 0x10,
(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
};
d_stream.zalloc = NULL;
d_stream.zfree = NULL;
d_stream.opaque = NULL;
d_stream.next_in  = zdata;
d_stream.avail_in = 0;
d_stream.next_out = data;
//if(inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1;
if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
while(d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
if(err != Z_OK) {
if(err == Z_DATA_ERROR) {
d_stream.next_in = (Bytef*) dummy_head;
d_stream.avail_in = sizeof(dummy_head);
if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) {
return -1;
}
} else return -1;
}

}
if(inflateEnd(&d_stream) != Z_OK) return -1;
*ndata = d_stream.total_out;
return 0;
}
 
使用 该函数 解压成功 但是解压后数据长度为0,存放解压后buff数据为空。
这是为什么?

我是对 获得的http数据包里 "\r\n\r\n"后的数据进行解压缩的,难道不对?

还是 要把所有的数据包 整合 一起解压?


 

------解决方案--------------------
解压前的数据可以看一下都有什么内容,长度是多少。