zlib - 仅在调用 inflateinit 两次后才工作

zlib - inflate only work after calling inflateinit twice

我的 RAM 中有一些预压缩数据(借助 Linux 上的 zlib-flate 压缩)。要使用此压缩数据,我想使用 zlib 和 inflate 对其进行 umcompress。

我在这个系统上没有动态内存管理,但为未压缩的数据提供了足够大的缓冲区。问题是如果我在调用 inflateInit 例程后调用 inflate 例程,我会得到一个未处理的异常。

但是,如果我两次调用 inflateInit 函数,则以下膨胀(=解压缩)工作正常,并且我将正确的解压缩数据放入我提供的缓冲区中。这很奇怪吧?

我也可以在调用 inflate 之前随时进行压缩,它也可以工作..到底是什么?

让我向您展示行为:

  1. 初始化膨胀
  2. 膨胀 > 失败

新运行..

  1. 初始化膨胀
  2. 初始化膨胀
  3. 膨胀 > 成功

新运行..

  1. 初始化放气
  2. deflate(成功但我没有使用结果)
  3. 初始化膨胀
  4. 膨胀 > 成功

某处有一个数组保存压缩数据:

uint8_t src [] = {.....};

这是我的缓冲区,绝对大到足以包含完整的解压缩数据。

#define BUF_SIZE 1000
uint8_t buf[BUF_SIZE];

这是我解压的代码:

z_stream strm;

strm.zalloc = Z_NULL;
strm.zfree  = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = srcLen;
strm.next_in = src;
strm.avail_out = BUF_SIZE;
strm.next_out = buf;
strm.data_type = Z_BINARY;

inflateInit(&strm);
inflateInit(&strm); // the follwing inflate only works with this second init

inflate(&strm, Z_NO_FLUSH);

我可以看到流的 state 成员从第一次初始化后的 0x40193678 变为第二次初始化后的 0x40195250 (也许这对你来说是重要信息).并且两个 inits 都是 Z_OK.

的响应

现在我希望你能帮助我..

它所做的是为流分配内存两次,仅使用第二次分配。我只能猜测,由于程序中的其他一些错误,您只是覆盖了第一个 inflateInit() 分配的内存。覆盖在尝试使用第一个分配时崩溃 inflate(),但在使用第二个分配时成功,第二个分配未被其他错误覆盖。