充气仅在调用充气两次后才有效



我的RAM中有一些预压缩的数据(在Linux上的zlib-flate的帮助下压缩(。要使用此压缩数据,我想使用 zlib 膨胀来压缩它。

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

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

我也可以随时在调用充气之前进行压缩,它也可以工作.. 什么鬼?

让我向您展示行为:

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

新运行..

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

新运行..

  1. initDeflate
  2. 放气(成功,但我不使用结果(
  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(也许这对您来说是一个重要的信息(。两个初始化都是对Z_OK的响应。

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

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

最新更新