我正在使用稍微修改过的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有谁知道如何贡献改进的代码?实现设计得很好,但从我的观点来看还不完整。
答案 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();
}
我在第一版代码中看到了两个问题:
(注意:我怀疑你是以专业身份认识我的。这个答案是以私人身份提供的,与我为雇主的工作无关。)