C++ zlib充气返回缓冲区错误

C++ zlib充气返回缓冲区错误,c++,zip,gzip,zlib,inflate,C++,Zip,Gzip,Zlib,Inflate,我正在尝试使用zlib(不使用任何扩展名或第三方)解压缩zip文件。 最初,src_len为48756255,dest_len为49209890。 while循环中的第一个过程很好:err是Z_OK,第二个过程开始。在第二个过程中,无论我做什么,我都会从充气中得到一个Z_BUF_错误。此时stream.total_out为49034460,因此还有一点剩余,但第二遍的stream.avail_in为0。在任何情况下,我都希望充气能给我一个Z_STREAM_END。我真的不知道发生了什么事,有人能

我正在尝试使用zlib(不使用任何扩展名或第三方)解压缩zip文件。 最初,src_len为48756255,dest_len为49209890。 while循环中的第一个过程很好:err是Z_OK,第二个过程开始。在第二个过程中,无论我做什么,我都会从充气中得到一个Z_BUF_错误。此时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);
}
充气()
将使用可用的输出处理尽可能多的输入。一旦它既不能处理输入也不能产生输出,它将返回
Z_BUF_ERROR

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

下面是对代码的一些其他注释。循环不执行任何操作,在循环中设置
next\u out
avail\u out
,就像不执行任何操作一样。在循环中没有提供新的输入或输出空间,因此没有循环的意义。在
inflate()
周围循环的唯一目的是提供更多的输入和/或输出空间。此外,当
inflate()
返回时,
next\u out
avail\u out
将更新到输出缓冲区中的下一个可用位置和可用空间量。在循环中设置
next\u out
avail\u out
的语句将这些设置为它们已有的值

在中,
Z_BUF_错误
不是问题,处理可以继续。虽然如果下次调用
inflate()
时期望得到不同的结果,但必须提供更多的输入和/或输出空间

无需使用零结构初始化
。后续的分配就是您所需要的。

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

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

下面是对代码的一些其他注释。循环不执行任何操作,在循环中设置
next\u out
avail\u out
,就像不执行任何操作一样。在循环中没有提供新的输入或输出空间,因此没有循环的意义。在
inflate()
周围循环的唯一目的是提供更多的输入和/或输出空间。此外,当
inflate()
返回时,
next\u out
avail\u out
将更新到输出缓冲区中的下一个可用位置和可用空间量。在循环中设置
next\u out
avail\u out
的语句将这些设置为它们已有的值

在中,
Z_BUF_错误
不是问题,处理可以继续。虽然如果下次调用
inflate()
时期望得到不同的结果,但必须提供更多的输入和/或输出空间


无需使用零结构初始化
。接下来的作业就是您所需要的。

什么是“临时分配器”。它有用吗?我这样做的方式是:我使用充气而不是充气2,但是你可以更改它,它仍然可以正常工作。我已经尝试了你发布的代码,我仍然在最后得到缓冲区错误,而不是流。什么是“templocator”。它有用吗?我这样做的方式是:我使用充气而不是充气2,但是你可以更改它,它仍然可以正常工作。我已经尝试了你发布的代码,我仍然在末尾得到缓冲区错误,而不是流结尾