我的RAM中有一些预压缩的数据(在Linux上的zlib-flate的帮助下压缩(。要使用此压缩数据,我想使用 zlib 膨胀来压缩它。
我在这个系统上没有动态内存管理,但为未压缩的数据提供了足够大的缓冲区。问题是,如果我在调用 inflateInit 例程后调用膨胀例程,我会收到一个未经处理的异常。
但是,如果我调用 inflateInit 函数两次,则以下膨胀(=解压缩(工作正常,我将正确的解压缩数据放入我提供的缓冲区中。这很奇怪不是吗?
我也可以随时在调用充气之前进行压缩,它也可以工作.. 什么鬼?
让我向您展示行为:
- 初始化膨胀
- 膨胀>失败
新运行..
- 初始化膨胀
- 初始化膨胀
- 夸大>成功
新运行..
- initDeflate
- 放气(成功,但我不使用结果(
- 初始化膨胀
- 夸大>成功
某处有一个数组保存压缩数据:
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 覆盖。