DotZlib - 膨胀错误处理代码1 Z_STREAM_END

时间:2009-05-15 14:21:11

标签: c# .net mono zlib

我正在使用稍微修改过的DotZlib版本,它是contrib目录的一部分,带有zlib源代码,用于扩展实时数据流。

我需要使用InflateInit2,而不是普通的inflateInit,但这只是提供的库的唯一区别。

Netherlesse在几次读取后,我从zlib收到错误代码1,并且在添加字节时无法恢复。

zlib contrib目录中的原始代码是:

    public override void Add(byte[] data, int offset, int count)
        {
            if (data == null) throw new ArgumentNullException();
            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException()
;
            if ((offset+count) > data.Length) throw new ArgumentException();

            int total = count;
            int inputIndex = offset;
            int err = 0;

            while (err >= 0 && inputIndex < total)
            {
                copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));
                err = inflate(ref _ztream, (int)FlushTypes.None);
                if (err == 0)
                    while (_ztream.avail_out == 0)
                    {
                        OnDataAvailable();
                        err = inflate(ref _ztream, (int)FlushTypes.None);
                    }

                inputIndex += (int)_ztream.total_in;
            }
            setChecksum( _ztream.adler );
        }
BTW有谁知道如何贡献改进的代码?实现设计得很好,但从我的观点来看还不完整。

1 个答案:

答案 0 :(得分:1)

我认为

            err = inflate(ref _ztream, (int)FlushTypes.None);
            if (err == 0)
                while (_ztream.avail_out == 0)
                {
                    OnDataAvailable();
                    err = inflate(ref _ztream, (int)FlushTypes.None);
                }

应该是

            while (_ztream.avail_in > 0)
            {
                err = inflate(ref _ztream, (int)FlushTypes.None);
                if (err!=0)
                    break;
                OnDataAvailable();
            }

我在第一版代码中看到了两个问题:

  1. 如果inflate()产生数据但产生的数据不足以使avail_out为0,即使数据可用,也不会调用OnDataAvailable。
  2. 即使avail_in为0,你也可以调用inflate(),我很容易想到这可能会产生一个流结束错误。
  3. (注意:我怀疑你是以专业身份认识我的。这个答案是以私人身份提供的,与我为雇主的工作无关。)