【发布时间】:2015-04-01 17:30:11
【问题描述】:
我正在尝试使用 zlib 解压缩 zip 文件(不使用任何扩展名或第 3 方)。 最初,src_len 是 48756255,dest_len 是 49209890。 while 循环中的第一次通过很好:err 是 Z_OK,第二次通过开始。在第二次通过时,无论我做什么,我都会从 inflate 中得到 Z_BUF_ERROR。此时的stream.total_out 是49034460,所以还有一点,但是第二遍的stream.avail_in 是0。无论如何,我希望inflate 给我Z_STREAM_END。真不知道怎么回事,有大神帮忙吗?
void compression::uncompress2(char* dest, unsigned dest_len, char* src, unsigned src_len) {
TempAllocator ta;
z_stream_s stream = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stream.next_in = (Bytef*)src;
stream.avail_in = (uInt)src_len;
stream.next_out = (Bytef*)dest;
stream.avail_out = (uInt)dest_len;
stream.zalloc = zalloc;
stream.zfree = zfree;
stream.opaque = &ta;
// no header
int err = inflateInit2(&stream, -MAX_WBITS);
XENSURE(err == Z_OK);
bool done = false;
while (!done) {
stream.next_out = (Bytef*)(dest + stream.total_out);
stream.avail_out = dest_len - stream.total_out;
err = inflate(&stream, Z_SYNC_FLUSH);
if (err == Z_STREAM_END)
done = true;
else if (err != Z_OK) {
break;
}
}
err = inflateEnd(&stream);
XENSURE(err == Z_OK);
}
【问题讨论】:
-
什么是“TempAllocator”。它有效吗?我这样做的方式是:pastebin.com/PdGWX4cc 我使用 inflate 而不是 inflate2 但你可以更改它,它仍然可以正常工作。
-
我已经尝试了您发布的代码,但我仍然在最后得到 Buffer 错误而不是 stream_end