我的RAM中有一些预压缩数据(在Linux上使用zlib-flate压缩)。要使用此压缩数据,我想使用zlib和inflate来压缩它。
我在这个系统上没有动态内存管理,但是为未压缩的数据提供了足够大的缓冲区。问题是如果在调用inflateInit例程后调用inflate例程,我会得到一个未处理的异常。
但是如果我调用inflateInit函数两次以下膨胀(=解压缩)工作正常,我将正确的解压缩数据放入我提供的缓冲区。这很奇怪不是吗?
我也可以在调用膨胀之前随时进行压缩,它也会起作用..到底是怎么回事?
让我告诉你行为:
new run ..
new run ..
有一个数组在某处保存压缩数据:
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
的响应。
现在我希望你能帮助我..
答案 0 :(得分:0)
它所做的是仅使用第二次分配为流分配两次内存。由于您的程序中存在其他错误,我只能猜测您是否覆盖了第一个inflateInit()
分配的内存。覆盖在尝试使用第一次分配时崩溃inflate()
,但在使用第二次分配时成功,而不会被其他错误覆盖。