ZLIB膨胀返回缓冲器错误(zlib inflate returning a buffer erro

2019-10-21 18:22发布

我试图使用解压缩的zlib压缩文件(不使用任何扩展或第三方)。 最初,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);
}

Answer 1:

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

在这种情况下,所有的输入的被处理并有输出剩余空间,但是没有检测到流的末尾。 你没有得到Z_STREAM_END因为某种原因,你没有提供完整的放气流。

这里是你的代码的一些其他意见。 你的循环不执行任何操作,并设置next_outavail_out为你做什么都不做的循环。 您提供您的循环中没有新的输入,也没有新的输出空间,所以在具有循环没有意义的。 具有围绕环的唯一目的inflate()是要么提供更多的输入,提供更多的输出空间,或两者。 此外,当inflate()返回时, next_outavail_out被更新,以在所述输出缓冲器中的下一个可用位置和可用空间的存在量。 你的语句设置next_outavail_out在回路设置那些他们已有的值。

在与适当的循环代码周围inflate()中, Z_BUF_ERROR是没有问题的,并且该处理可以继续进行。 如果你希望在下次调用一个不同的结果。虽然inflate()更多的输入和/或多个输出空间必须提供。

有没有需要初始化stream与零的结构。 随后的分配是你所需要的。



文章来源: zlib inflate returning a buffer error