2017-05-09 2 views
0

Ich benutzte GZipStream für einige Zeit ohne Probleme. Ich habe bei meiner Funktion keinen Code geändert, aber jetzt funktioniert das Komprimieren und Dekomprimieren nicht. Ich habe das folgende einfache Beispiel extrahiert (vielleicht mache ich im Allgemeinen etwas falsch).C# GZipStream funktioniert plötzlich nicht

public static class ZipLib 
{ 
    #region Public Methods 

    public static string Unzip(byte[] compressedText) 
    { 
     try { 
      byte[] gzBuffer = compressedText; 
      int msgLength = BitConverter.ToInt32(gzBuffer, 0); 
      byte[] buffer = new byte[msgLength]; 
      using (MemoryStream ms = new MemoryStream()) { 
       ms.Write(gzBuffer, 4, gzBuffer.Length - 4); 

       using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) { 
        zip.Read(buffer, 0, buffer.Length); 
       } 
      } 
      return Encoding.UTF8.GetString(buffer); 
     } 
     catch (Exception ex) { 
      Debug.WriteLine(ex.Message); 
     } 
     return ""; 
    } 

    public static byte[] Zip(string text) 
    { 
     byte[] buffer = Encoding.UTF8.GetBytes(text); 
     MemoryStream ms = new MemoryStream(); 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) { 
      zip.Write(buffer, 0, buffer.Length); 
     } 

     ms.Position = 0; 

     byte[] compressed = new byte[ms.Length]; 
     ms.Read(compressed, 0, compressed.Length); 

     byte[] gzBuffer = new byte[compressed.Length + 4]; 
     Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); 
     Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); 

     return gzBuffer; 
    } 

    #endregion 
} 

internal class Program 
{ 
    #region Private Methods 

    private static void Main(string[] args) 
    { 
     string uncompressedIn = "Hallo Welt"; 
     var compressed = ZipLib.Zip(uncompressedIn); 
     var uncompressed = ZipLib.Unzip(compressed); 
     Console.WriteLine("Uncompressed Input: " + uncompressedIn); 
     Console.WriteLine("Compressed value: " + string.Join(" | ", compressed)); 
     Console.WriteLine("Uncompressed from compressed: " + string.Join(" | ", uncompressed.ToCharArray())); 
     Console.ReadKey(); 
    } 

    #endregion 
} 

Der Wert uncompressed"\0\0\0\0" ...

ist
+0

Ich habe versucht, das Problem mit dem mitgelieferten Code zu erstellen, aber ich bekomme keine Ausgabe an alles: https://dotnetfiddle.net/BCSheL. Bearbeiten Sie einfach diese Geige, damit Ihr Fehler korrekt neu erstellt wird. –

+0

Dies kann nur durch Zufall funktionieren. Encoding.UTF8 kann keine beliebigen Bytewerte verarbeiten, sie müssen gültige Unicode-Codepoints sein. Die Codierung eines Bytes [] erfordert Convert.To/FromBase64String(). Die Unzip() -Methode fehlt ms.Position = 0; Dies hat noch nie zuvor funktioniert, Sie sollten ziemlich besorgt sein darüber, dies nicht früher zu bemerken. –

Antwort

2

In Unzip Sie Write zu einem MemoryStream, gibt sie dann an die GZipStream aus zu lesen, aber: es ist immer noch am Ende des Stroms Du hast es nicht zurückgespult. Versuchen Sie hinzuzufügen:

ms.Position = 0; 

nach der Write. Beachten Sie jedoch, dass es effizienter sein könnte zu tun:

using(MemoryStream ms = new MemoryStream(gzBuffer, 4, gzBuffer.Length - 4)) 
{ 
    //... 
} 

dies einen Speicher vermeidet Duplizierung

+0

Danke, jetzt funktioniert es. Vielleicht haben einige Code-Cleanup-Aktionen in der Vergangenheit dieses Problem verursacht und ich war zu blind, um es zu sehen. – WPFGermany

Verwandte Themen