Ich brauchte eine Möglichkeit, Bilder in .net zu komprimieren, also habe ich in der Verwendung der .net GZipStream-Klasse (oder DeflateStream) untersucht. Ich fand jedoch, dass die Dekomprimierung nicht immer erfolgreich war, manchmal dekomprimierten die Bilder in Ordnung, und andere Male würde ich einen GDI + -Fehler bekommen, dass etwas beschädigt ist.GZipStream und DeflateStream werden nicht alle Bytes dekomprimieren
Nachdem ich das Problem untersucht hatte, stellte ich fest, dass die Dekomprimierung nicht alle komprimierten Bytes zurückgab. Also, wenn ich 2257974 Bytes komprimierte, würde ich manchmal nur 2257870 Bytes (reelle Zahlen) zurückbekommen.
Die lustigste Sache ist, dass es manchmal funktionieren würde. Also habe ich diese kleine Testmethode erstellt, die nur 10 Bytes komprimiert und jetzt bekomme ich überhaupt nichts zurück.
Ich habe es mit beiden Komprimierungsklassen GZipStream und DeflateStream versucht und ich habe meinen Code auf mögliche Fehler überprüft. Ich habe sogar versucht, den Stream auf 0 zu setzen und alle Streams zu löschen, aber ohne Glück.
Hier ist mein Code:
public static void TestCompression()
{
byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = Decompress(Compress(test));
// This will fail, result.Length is 0
Debug.Assert(result.Length == test.Length);
}
public static byte[] Compress(byte[] data)
{
var compressedStream = new MemoryStream();
var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
zipStream.Write(data, 0, data.Length);
return compressedStream.ToArray();
}
public static byte[] Decompress(byte[] data)
{
var compressedStream = new MemoryStream(data);
var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
var resultStream = new MemoryStream();
var buffer = new byte[4096];
int read;
while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
resultStream.Write(buffer, 0, read);
}
return resultStream.ToArray();
}
Re deinen Kommentar - es kommt zu Puffern auf verschiedenen Ebenen; Wenn sie nicht alle geleert sind (in der richtigen Reihenfolge), erhalten Sie nicht alle Daten. –
Beachten Sie, dass ich zum Beispiel nicht Close() auf dem MemoryStream selbst angerufen habe - also stimme ich teilweise zu ;-p –
Ich werde ein Update dazu hinzufügen, auch ... –