Compression zlib';s充气/放气使大约有进有出?

Compression zlib';s充气/放气使大约有进有出?,compression,zlib,deflate,inflate,miniz,Compression,Zlib,Deflate,Inflate,Miniz,调用充气后,zlib对avail\u in和avail\u out的状态提供了什么保证?我看到了miniz的特殊行为,我想确保这不是对zlibAPI的误解。实际上,在调用inflate后,我的avail\u in为非零,avail\u out也为非零,因此一些输入看起来没有得到处理。更多详情见下文 我一直在使用对从磁盘流入/流出的文件进行充气/放气。我的充气/放气循环与中的zlib示例相同,包括使用MZ_NO_FLUSH 这个循环几乎总是有效的,但今天我对一个流进行了充气,并在前面进行了放气,得

调用
充气
后,
zlib
avail\u in
avail\u out
的状态提供了什么保证?我看到了
miniz
的特殊行为,我想确保这不是对
zlib
API的误解。实际上,在调用
inflate
后,我的
avail\u in
为非零,
avail\u out
也为非零,因此一些输入看起来没有得到处理。更多详情见下文

我一直在使用对从磁盘流入/流出的文件进行充气/放气。我的充气/放气循环与中的zlib示例相同,包括使用
MZ_NO_FLUSH

这个循环几乎总是有效的,但今天我对一个流进行了充气,并在前面进行了放气,得到了一致的
MZ_DATA_错误。在添加了正确的标题之后,
gzip
能够很好地将其充气,我的数据也完好无损

我的问题源于最后一次调用
mz_-inflate
。我在这里包括典型的充气回路:

/* decompress until deflate stream ends or end of file */
do {
    strm.avail_in = fread(in, 1, CHUNK, source);
    if (ferror(source)) {
        (void)inflateEnd(&strm);
        return Z_ERRNO;
    }
    if (strm.avail_in == 0)
        break;
    strm.next_in = in;

    /* run inflate() on input until output buffer not full */
    do {
        strm.avail_out = CHUNK;
        strm.next_out = out;
        ret = inflate(&strm, Z_NO_FLUSH);
        assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
        switch (ret) {
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;     /* and fall through */
        case Z_DATA_ERROR:
        case Z_MEM_ERROR:
            (void)inflateEnd(&strm);
            return ret;
        }
        have = CHUNK - strm.avail_out;
        if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
            (void)inflateEnd(&strm);
            return Z_ERRNO;
        }
    } while (strm.avail_out == 0);

    /* done when inflate() says it's done */
} while (ret != Z_STREAM_END);
内部
do
循环重复,直到所有当前块都已处理完毕,并且
avail\u out
有额外的空间。但是,在这个特定流的最后一块上,
inflate
没有返回错误,而是将
avail\u in
减少到某个非零数字,并且将
avail\u out
也减少到某个(其他)非零数字。因此,内部的
do
循环退出,因为
avail\u out
是非零的,我们尝试在
next\u in
avail\u in
中获取更多数据,即使没有处理完
avail\u in
中的所有
avail\u,因为
avail\u in
是非零的。这会在
中的
next_和
avail_中重击任何内容,
充气
在下一次调用时失败

我的解决方法是将内部循环的终止条件从

strm.avail_out == 0

但我不知道这是否正确。我觉得这可能是miniz中的一个bug,但我不确定。我本以为如果
avail\u in
指示仍有数据需要处理,那么
avail\u out
必须为零

如果相关:我使用的输入缓冲区大小为512KB,输出缓冲区大小为2MB。

如果
inflate()
返回
Z_OK
Z_BUF_ERROR
,并且
avail_out
不为零,则
avail_In
为零

你能提供有问题的压缩数据吗?

如果
充气()
返回
Z_OK
Z_BUF_ERROR
,并且
avail_out
不为零,则
avail_in
为零


你能提供有问题的压缩数据吗?

嘿,马克,我要到星期一才能再次访问这些数据,但到时候我可以提供。谢谢你的回答!嗨,马克,我已经确认这确实是miniz中的一个bug。直接加入zlib不会出现同样的问题。如果你还感兴趣的话,我已经把数据放在这里了:嘿,马克,我要到星期一才能再次访问数据,但到时候我可以提供。谢谢你的回答!嗨,马克,我已经确认这确实是miniz中的一个bug。直接加入zlib不会出现同样的问题。如果你还感兴趣,我把数据放在这里:
strm.avail_out == 0 || strm.avail_in > 0