GZipStream.WriteByte

28/08/2009 - 17:21 von Volker Heil | Report spam
Hallo,

ich wollte heute ein paar Daten in den GZipStream schreiben und habe
das wie in der Variante 1 beschrieben EINZELN gemacht. Dabei hat er
die Daten jedoch NICHT komprimiert! Die Million einzelner Bytes waren
zwar im Ergebnis "codiert", aber die Datei exakt eine Million Zeichen
gross (zuzgl. ZIP-Overhead).
Für was gibt es beim Komprimieren ein "WriteByte", wenn es nicht
komprimiert?
Erst als ich alles in ein Byte-Array umgestrickt hatte und es mit
"Write" verschickt hatte ging es. (Variante 2)
Ist das ein Bug? Oder hat das irgendeinen nachvollziehbaren Grund?

Const Pfad As String = "C:\"
Const menge As Int32 = 1000000
Dim BA(menge) As Byte
Dim F As IO.FileStream = New IO.FileStream(Pfad & "test.txt",
IO.FileMode.Create)
Dim Z As New IO.Compression.GZipStream(F,
IO.Compression.CompressionMode.Compress)

'Variante1:
For x As Int32 = 1 To menge
Z.WriteByte(65)
Next

' Variante2:
For x As Int32 = 1 To menge
BA(x) = 65
Next
Z.Write(BA, 0, BA.Length)

Z.Close()

Tschüss,

Volker
 

Lesen sie die antworten

#1 Elmar Boye
29/08/2009 - 09:12 | Warnen spam
Hallo Volker,

Volker Heil schrieb:
ich wollte heute ein paar Daten in den GZipStream schreiben und habe
das wie in der Variante 1 beschrieben EINZELN gemacht. Dabei hat er
die Daten jedoch NICHT komprimiert! Die Million einzelner Bytes waren
zwar im Ergebnis "codiert", aber die Datei exakt eine Million Zeichen
gross (zuzgl. ZIP-Overhead).
Für was gibt es beim Komprimieren ein "WriteByte", wenn es nicht
komprimiert?



Gibt es nicht wirklich. Wenn Du genau hinguckst überschreibt
ein GZipStream WriteByte nicht und es wird die WriteByte Methode
von Stream verwendet.
Die wiederum erstellt einen Puffer von einem Byte und ruft
WriteByte(byte[]...).

Erst als ich alles in ein Byte-Array umgestrickt hatte und es mit
"Write" verschickt hatte ging es. (Variante 2)



Da ist die einzige sinnvolle Variante.

Ist das ein Bug? Oder hat das irgendeinen nachvollziehbaren Grund?



Der von GZip verwendete Algorithmus benötigt genügend Daten
um effizient zu sein: http://de.wikipedia.org/wiki/Deflate

Das Fehlen von WriteByte könnte man zwar als Bug einstufen,
denn technisch das Kumulieren seitens des Streams denkbar.
Nur weist die der Dokumentation indirekt darauf hin,
das dies nicht geschieht:
<URL:http://msdn.microsoft.com/de-de/lib...m.aspx>

<Zitat>
Die Daten werden _byteweise gelesen_, sodass nicht mehrere Durchlàufe
durchgeführt werden können, um die optimale Komprimiermethode
für ganze Dateien oder große Datenblöcke zu ermitteln.
</Zitat>

"byteweise" ist dabei etwas unscharf, genauer wàre blockweise.

Gruß Elmar

Ähnliche fragen