Zlib从http数据包中提取数据

时间:2013-10-24 20:34:49

标签: http gzip zlib

我正在尝试使用zlib的inflate解压缩从http数据包收到的一些数据。

数据包如下:

enter image description here

数据包本身表示它是用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;  
}

1 个答案:

答案 0 :(得分:0)

是的,你需要使用inflateInit2()和第二个参数作为31来请求gzip解压缩。如果你正在喂它1f 8b 08 00 ...,那么你将不会得到“未知标题标志设置”。这绝不是你正在做的事情。

顺便说一句,它不会设置total_intotal_out,因为它们被inflateInit[2]()设置为零。将它们设置为您在有效位置所做的值,例如在inflateInit之后,也没有任何意义。

avail_out设置为输入大小的六倍是猜测,并不总是足够的。如果这还不够,那么Z_FINISH会出错。您应该使用循环来根据需要多次调用inflate()来处理输入并生成输出。

我建议您阅读zlib.h,然后阅读how to use zlib