Dav*_*ard 1 c++ zip gzip zlib inflate
我正在尝试使用zlib解压缩zip文件(不使用任何扩展或第三方).最初,src_len是48756255,dest_len是49209890.在while循环中第一次传递很好:err是Z_OK,第二次传递开始.在第二遍,无论我做什么,我都会从膨胀中获得Z_BUF_ERROR.此时stream.total_out是49034460,所以有一点剩余,但第二遍的stream.avail_in为0.无论如何,我希望膨胀给我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);
}
Run Code Online (Sandbox Code Playgroud)
inflate()将使用可用输出处理尽可能多的输入.一旦它既不能处理输入也不能产生输出,它将返回Z_BUF_ERROR.
在这种情况下,处理所有输入并且有备用输出空间,但未检测到流的末尾.你没有得到Z_STREAM_END因为某些原因你没有提供完整的deflate流.
以下是对您的代码的一些其他评论.你的循环什么也不做,设置next_out和avail_out循环就像你做的一样.你在循环中没有提供新的输入或新的输出空间,所以没有一个循环.循环的唯一目的inflate()是提供更多输入,提供更多输出空间,或两者兼而有之.此外,当inflate()返回时,next_out并avail_out更新到输出缓冲区中的下一个可用位置以及那里的可用空间量.您在循环中设置next_out和设置的语句avail_out将这些语句设置为已有的值.
在具有适当循环的代码中inflate(),a Z_BUF_ERROR不是问题,并且处理可以继续.虽然如果您希望下次调用时得到不同的结果,则inflate()必须提供更多输入和/或更多输出空间.
无需stream使用零结构进行初始化.随后的作业就是您所需要的.
| 归档时间: |
|
| 查看次数: |
2200 次 |
| 最近记录: |