Domanda

Io sto usando una versione leggermente modificata del DotZlib che è parte di directory contrib con zlib codice sorgente per gonfiare un flusso di dati in tempo reale.

Invece del normale inflateInit ho bisogno di usare InflateInit2 - ma questo l'unica differenza per la fornita biblioteca.

Netherlesse dopo un paio di letture, ho visualizzato il codice di errore 1 zlib e non riescono a recuperare quando l'aggiunta di byte.

Codice originale dal zlib directory 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 qualcuno sa come contribuire al miglioramento del codice?La realizzazione è ben progettato, ma incompleta, dal mio punto di vista.

È stato utile?

Soluzione

Penso che

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

dovrebbe essere

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

Ci sono due problemi che vedere con la prima versione del codice:

  1. se inflate() produce dati, ma non produce una quantità sufficiente di dati per rendere avail_out essere 0, non chiamare OnDataAvailable, anche se i dati disponibili.
  2. si potrebbe chiamare inflate() anche se avail_in è 0, che ho potuto facilmente immaginare potrebbe produrre un flusso fine di errore.

(NB:Ho il sospetto che tu mi conosci a titolo professionale.Questa risposta è dato a titolo privato e non è legato al mio lavoro per il mio datore di lavoro.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top