ZLIB 膨胀流 header 格式

ZLIB inflate stream header format

下载 ZLIB 版本后。 1.2.11 并查看 RFC1951 我正在尝试使用 ZLIB.inflate 函数,如下所示:

#include "zlib.h"

int iRslt;
unsigned char buffIn[4]={0x4b,4,0,0};
unsigned char buffOut[16];
z_stream zStrm;

  memset(&zStrm, 0, sizeof(zStrm));
  zStrm.zalloc = Z_NULL;
  zStrm.zfree = Z_NULL;
  zStrm.opaque = Z_NULL;
  zStrm.avail_in = 0;
  zStrm.next_in = Z_NULL;
  iRslt = inflateInit(&zStrm);
  if(iRslt != Z_OK) return;

  zStrm.avail_in = sizeof(buffIn);
  zStrm.next_in = buffIn;
  zStrm.avail_out = sizeof(buffOut);
  zStrm.next_out = buffOut;
  iRslt = inflate(&zStrm, Z_NO_FLUSH);
  if(iRslt == Z_DATA_ERROR){//-3
    //why do I end up here with zStrm.msg -> "incorrect header check"?
  }

我的 buffIn 包含比特流 header 011b: BFINAL=1; BTYPE=01b;并修复了字符 'a' (0x61) 的霍夫曼代码,后跟至少 7 个零位以结束该块。显然这还不够;请帮忙。 提前谢谢了; 波巴.

您的代码正在寻找 zlib 流 header,如 RFC 1950 中所定义。它没有找到它。该 RFC 定义了 zlib header 和包裹在原始 deflate 流周围的预告片。

你的问题中有原始压缩流。要解码它而不是 zlib 流,您需要使用 inflateInit2()windowBits 值为 -15