2010-11-28 4 views
3

Ich brauche eine zlib deflate komprimierten Stream. In meiner Implementierung muss ich einen einzigen Stream über die gesamte Sitzung verwenden. Während dieser Sitzung werden kleine Datenblöcke durch den komprimierten Stream geleitet. Jedes Mal, wenn ein Chunk übergeben wird, muss er sofort in komprimierter Form gesendet werden."Sync flush" für Zlib Deflate

Mein erster Versuch war DeflateStream zu verwenden, aber wenn ich den ersten Chunk sende, werden seine komprimierten Daten nicht angezeigt, bis ich den Stream schließe.

Lesen über zlib flush modes es scheint, als gäbe es einen bestimmten Modus für das, was ich brauche.

  1. Verwende ich die korrekte Klasse (DeflateStream) für zlib deflate Kompression?
  2. Wie kann ich "Sync Flush" Verhalten aktivieren?

Antwort

2

Das Projekt DotNetZip hat ein Submodul Zlib, das eine eigene Implementierung von DeflateStream enthält.

Diese Implementierung eine andere Eigenschaft hat namens Flushmode:

DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress); 
deflate.FlushMode = FlushType.Sync; 
deflate.Write (data, 0, data.Length); 
//No call to deflate.Flush() needed, automatically flushed on every write. 
+0

Leider unterstützt diese Bibliothek asynchrone Methoden nicht richtig. Obwohl die Komprimierung selbst nicht von asynchronen Operationen profitiert (CPU-gebunden), profitiert der zugrunde liegende Stream oft, wenn Sie über ein Netzwerk senden/empfangen. –

0

Es ist in der Tat nur beim Schließen flush. Sie müssen eine andere DeflateStream Instanz jedes Mal verwenden, wahr zum overloaded constructor erzählen es vorbei nicht die zugrunde liegenden Stream zu schließen, wenn Sie die DeflateStream schließen.

+0

Ich fürchte, das ist keine Option, da der Stream mit einem vordefinierten Anfangsblock von 900 Bytes beginnt, daher meine Anforderung an einen einzigen laufenden Stream. – hultqvist

0

Um Ihre Frage zu beantworten, wie Sie „sync flush“ Verhalten ermöglichen könnte, sollten Sie das zpipe.c Beispiel in der zlib-Quellcode sehen.
Ersetzen Sie die erste Zeile mit der zweiten Zeile unter

Deflate() gezeigt wird jedes Mal, wenn der Ausgabepuffer voll zurückkehren oder wenn der Eingangspuffer auch eine Anfügen an den komprimierten Strom ein leerer wörtliche Block "leer ist mittlerweile genannt Synchronisierung flush "außer am Ende, das ist die Z_FINISH Flagge.

Verwandte Themen