Frage

Ich verwende eine leicht modifizierte Version des DotZlib, die Teil des contrib Verzeichnis mit dem zlib Quellcode ist eine Echtzeit-Datenstrom aufzublasen.

Statt der regulären inflateInit Ich brauche InflateInit2 zu verwenden -. Aber diese den einzigen Unterschied zu der mitgelieferten Bibliothek

Netherlesse nach ein paar liest I Fehlercode 1 von der zlib erhalten und es nicht schaffen, sich zu erholen, wenn Bytes hinzugefügt wird.

Der ursprüngliche Code aus dem zlib contrib Verzeichnis ist:

    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 Wer weiß, wie verbesserten Code beitragen? Die Umsetzung ist schön gestaltet, aber nicht vollständig aus meiner Sicht.

War es hilfreich?

Lösung

Ich denke, dass

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

sollte

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

Es gibt zwei Probleme, die ich mit der ersten Version des Codes finden Sie unter:

  1. , wenn aufblasen () Daten erzeugt, aber nicht genügend Daten avail_out 0 sein, werden Sie nicht OnDataAvailable nennen, obwohl Daten verfügbar sind.
  2. machen
  3. könnten Sie rufen aufblasen (), obwohl avail_in 0 ist, was ich leicht einen Strom-End-Fehler könnte produzieren vorstellen kann.

(NB:.. Ich vermute, dass Sie mich in einer beruflichen Tätigkeit kennen diese Antwort in einer privaten Kapazität gegeben wird und nicht zu meiner Arbeit für meinen Arbeitgeber bezogen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top