1

我正在尝试使用 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;  
}
4

1 回答 1

0

是的,您需要使用inflateInit2()第二个参数为 31 来请求 gzip 解压缩。如果你给它喂食1f 8b 08 00 ...,那么你不会得到“未知的标头标志集”。那一定不是你正在做的事情。

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

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

我建议您阅读zlib.h,然后阅读如何使用 zlib

于 2013-10-25T01:58:21.767 回答