zlib - 仅在调用inflateinit两次后才会进行膨胀

时间:2018-06-07 13:46:39

标签: exception zlib init compression inflate

我的RAM中有一些预压缩数据(在Linux上使用zlib-flate压缩)。要使用此压缩数据,我想使用zlib和inflate来压缩它。

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

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

我也可以在调用膨胀之前随时进行压缩,它也会起作用..到底是怎么回事?

让我告诉你行为:

  1. initInflate
  2. 膨胀>的失败
  3. new run ..

    1. initInflate
    2. initInflate
    3. 膨胀>的成功
    4. new run ..

      1. initDeflate
      2. 放气(成功,但我不会使用结果)
      3. initInflate
      4. 膨胀>的成功
      5. 有一个数组在某处保存压缩数据:

        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成员在第一个init之后从0x40193678更改为第二个init之后的0x40195250(这可能是您的重要信息)。这两个插件都是Z_OK的响应。

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

1 个答案:

答案 0 :(得分:0)

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