2016-12-01 2 views
5

Ich muss ein Array von Bytes komprimieren. Also schrieb ich diesen Schnipsel:Mit Gzip ein Array von Bytes komprimieren/dekomprimieren

class Program 
    { 
     static void Main() 
     { 
      var test = "foo bar baz"; 

      var compressed = Compress(Encoding.UTF8.GetBytes(test)); 
      var decompressed = Decompress(compressed); 
      Console.WriteLine("size of initial table = " + test.Length); 
      Console.WriteLine("size of compressed table = " + compressed.Length); 
      Console.WriteLine("size of decompressed table = " + decompressed.Length); 
      Console.WriteLine(Encoding.UTF8.GetString(decompressed)); 
      Console.ReadKey(); 
     } 

     static byte[] Compress(byte[] data) 
     { 
      using (var compressedStream = new MemoryStream()) 
      using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) 
      { 
       zipStream.Write(data, 0, data.Length); 
       zipStream.Close(); 
       return compressedStream.ToArray(); 
      } 
     } 

     static byte[] Decompress(byte[] data) 
     { 
      using (var compressedStream = new MemoryStream(data)) 
      using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) 
      using (var resultStream = new MemoryStream()) 
      { 
       zipStream.CopyTo(resultStream); 
       return resultStream.ToArray(); 
      } 
     } 
    } 

Das Problem ist, dass ich diese Ausgabe erhalten:

output

Ich verstehe nicht, warum die Größe des komprimierten Array größer ist als die dekomprimiert ein!

Irgendwelche Ideen?

bearbeiten

nach Kommentar des @ spender: Wenn ich test Zeichenfolge beispielsweise ändern:

var test = "foo bar baz very long string for example hdgfgfhfghfghfghfghfghfghfghfghfghfghfhg"; 

ich anderes Ergebnis zu bekommen. Was ist also die Mindestgröße des zu komprimierenden Ausgangsarrays?

+2

Da die Daten so klein ist, dass die Gemeinkosten des Kompressionsformat der Verstärkung der Kompression aufwiegen. Probiere mehr Daten aus. Hinweis: vollständig zufällige Daten werden nicht komprimiert. – spender

+0

@spender plz sehe meine Bearbeitung und posten Sie Ihre Idee als Antwort, danke –

Antwort

1

Komprimierte Datei hat Header und es erhöht die Dateigröße, wenn die Eingabegröße sehr klein ist, kann die Ausgabe noch größer sein, wie Sie sehen. Probieren Sie es mit einer Datei mit größerer Größe.

1

Dies liegt daran, dass die Datenmenge so gering ist, dass die Overheads des Komprimierungsformats den Gewinn der Komprimierung überwiegen.

Versuchen Sie mehr Daten.

Wenn Sie völlig zufällige Daten (oder bereits komprimierte Daten wie JPEG) komprimiert haben, würden Sie nie einen signifikanten Gewinn machen. Allerdings würde die Zeichenfolge new String('*',1000000) wirklich schön komprimieren.

GZIP fügt mindestens 18 Bytes hinzu, so dass alles unter oder nur geringfügig über dieser Größe, die leicht komprimiert werden kann, nicht profitieren wird.

Hier ist eine interessante Frage, die weiter in GZIP-Sonden: What's the most that GZIP or DEFLATE can increase a file size?

Verwandte Themen