1

リアルタイム データ ストリームを拡張するために、zlib ソース コードを含む contrib ディレクトリの一部である DotZlib のわずかに変更されたバージョンを使用しています。

通常の inflateInit の代わりに InflateInit2 を使用する必要がありますが、これが提供されたライブラリとの唯一の違いです。

数回読み取りを行った後、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 );
        }

ところで、改善されたコードに貢献する方法を知っている人はいますか? 実装は適切に設計されていますが、私の観点からは不完全です。

4

1 に答える 1

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();
            }

コードの最初のバージョンには 2 つの問題があります。

  1. inflate() がデータを生成するが、avail_out を 0 にするのに十分なデータを生成しない場合、データが利用可能であっても OnDataAvailable を呼び出しません。
  2. avail_in が 0 であっても inflate() を呼び出すと、ストリーム終了エラーが発生する可能性があることが容易に想像できます。

(注:あなたは私を職業上の立場で知っていると思います。この回答は私的な立場で与えられたものであり、雇用主のための私の仕事とは関係ありません。)

于 2009-05-18T10:45:33.827 に答える