c++ - zlib inflate 返回缓冲区错误

标签 c++ zip gzip zlib inflate

我正在尝试使用 zlib 解压缩一个 zip 文件(不使用任何扩展名或第 3 方)。 最初,src_len 是 48756255,dest_len 是 49209890。 while 循环中的第一次通过很好:err 是 Z_OK,第二次通过开始。在第二遍中,无论我做什么,我都会从膨胀中得到一个 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);
}

最佳答案

inflate() 将使用可用输出处理尽可能多的输入。一旦它既不能处理输入也不能产生输出,它将返回Z_BUF_ERROR

在这种情况下,所有输入都已处理,并且有输出空间可供使用,但未检测到流的结尾。您没有得到 Z_STREAM_END,因为出于某种原因您没有提供完整的 deflate 流。

以下是对您的代码的一些其他评论。您的循环什么都不做,并且在循环中设置 next_outavail_out 什么也不做。您在循环中没有提供新的输入或新的输出空间,因此循环没有意义。围绕 inflate() 进行循环的唯一目的是提供更多输入,提供更多输出空间,或两者兼而有之。此外,当 inflate() 返回时,next_outavail_out 将更新为输出缓冲区中的下一个可用位置以及那里的可用空间量。在循环中设置 next_outavail_out 的语句将它们设置为它们已有的值。

code with proper loops around inflate() , Z_BUF_ERROR 不是问题,处理可以继续。尽管如果您希望在下一次调用 inflate() 时得到不同的结果,则必须提供更多的输入和/或更多的输出空间。

不需要用零结构初始化stream。后续作业就是您所需要的。

关于c++ - zlib inflate 返回缓冲区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28283334/

相关文章:

objective-c - 使用 ZIP 存档存储 NSDocument 数据

java - 在 Servlet 端使用 excel 表生成内存中的 zip 文件

webpack - 我们是否需要手动设置 Nuxt 发送 gzipped 或 brotli-compressed 文件?

algorithm - 用于压缩的 HTML 属性的优化顺序

c++ - 用于映射一对一关系的 STL 类型?

c++ - 对于在 C++ 中找不到异常,您会怎么想?

android - 使用 zip 时保持一些文件未压缩

php - Gzip 压缩的带有 php header 的 css 文件,第一个 css 行不起作用

c++ - Googletest Eclipse C++ : How to have both test and production executable?

c++ - $(SolutionDir)\..\..\..\的含义是什么