Ich verwende eine leicht modifizierte Version von DotZlib, die Teil des contrib-Verzeichnisses mit dem zlib-Quellcode ist, um einen Echtzeit-Datenstrom aufzublasen.DotZlib - Code zur Fehlerbehandlung auffüllen 1 Z_STREAM_END
Anstelle der regulären InflateInit muss ich InflateInit2 verwenden - aber das ist der einzige Unterschied zu der bereitgestellten Bibliothek.
Netherlesse nach ein paar Lesevorgänge erhalte ich Fehlercode 1 von der zlib und es gelingt mir nicht, wiederherzustellen, wenn Bytes hinzugefügt werden.
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 Implementierung ist schön gestaltet, aber aus meiner Sicht unvollständig.
FYI, gibt es ein 100% verwaltet ZlibStream in DotNetZip - http://dotnetzip.codeplex.com. – Cheeso
Ja - aber ich muss die Kompressionsunterstützung zu einer Echtzeitanwendung hinzufügen - daher muss ich maximale Leistung haben. – weismat