zlib - 仅在调用 inflateinit 两次后才工作
zlib - inflate only work after calling inflateinit twice
我的 RAM 中有一些预压缩数据(借助 Linux 上的 zlib-flate 压缩)。要使用此压缩数据,我想使用 zlib 和 inflate 对其进行 umcompress。
我在这个系统上没有动态内存管理,但为未压缩的数据提供了足够大的缓冲区。问题是如果我在调用 inflateInit 例程后调用 inflate 例程,我会得到一个未处理的异常。
但是,如果我两次调用 inflateInit 函数,则以下膨胀(=解压缩)工作正常,并且我将正确的解压缩数据放入我提供的缓冲区中。这很奇怪吧?
我也可以在调用 inflate 之前随时进行压缩,它也可以工作..到底是什么?
让我向您展示行为:
- 初始化膨胀
- 膨胀 > 失败
新运行..
- 初始化膨胀
- 初始化膨胀
- 膨胀 > 成功
新运行..
- 初始化放气
- deflate(成功但我没有使用结果)
- 初始化膨胀
- 膨胀 > 成功
某处有一个数组保存压缩数据:
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()
,但在使用第二个分配时成功,第二个分配未被其他错误覆盖。
我的 RAM 中有一些预压缩数据(借助 Linux 上的 zlib-flate 压缩)。要使用此压缩数据,我想使用 zlib 和 inflate 对其进行 umcompress。
我在这个系统上没有动态内存管理,但为未压缩的数据提供了足够大的缓冲区。问题是如果我在调用 inflateInit 例程后调用 inflate 例程,我会得到一个未处理的异常。
但是,如果我两次调用 inflateInit 函数,则以下膨胀(=解压缩)工作正常,并且我将正确的解压缩数据放入我提供的缓冲区中。这很奇怪吧?
我也可以在调用 inflate 之前随时进行压缩,它也可以工作..到底是什么?
让我向您展示行为:
- 初始化膨胀
- 膨胀 > 失败
新运行..
- 初始化膨胀
- 初始化膨胀
- 膨胀 > 成功
新运行..
- 初始化放气
- deflate(成功但我没有使用结果)
- 初始化膨胀
- 膨胀 > 成功
某处有一个数组保存压缩数据:
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()
,但在使用第二个分配时成功,第二个分配未被其他错误覆盖。