【问题标题】:zlib inflate returning a buffer errorzlib inflate 返回缓冲区错误
【发布时间】: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

标签: c++ zip gzip zlib inflate


【解决方案1】:

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

在这种情况下,所有的输入都被处理并且有输出空间可用,但是没有检测到流的结尾。您没有收到Z_STREAM_END,因为由于某种原因您没有提供完整的放气流。

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

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

没有必要用零结构初始化stream。后续的作业就是你所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2016-03-29
    • 2012-05-25
    • 2011-05-31
    相关资源
    最近更新 更多