2016-11-10 1 views
0

Es gibt einen Beitrag hier Compress and decompress string in c# zum Komprimieren von Zeichenfolge in C#.GZipStream macht meinen Text größer als das Original

Ich habe den gleichen Code für mich implementieren, aber die zurückgegebene Text ist fast doppelt so meins: O

ich es mit Größe auf einem json versucht haben wie folgt aus:

{ "G": "82f88ff5-4143-46ef-86cc-a19910f4a6b5", "U": "df39e3c7-ffd3-4829-a9cd-27bfcbd4403a"}

Das Ergebnis ist

H4sIAAAAAAAEAC2NUQ6DIBQE5yx8l0QFqfQCnqAHqKCXaHr3jsaQ3TyYfcuXwKpeamHi0Bf9YCaSGVW6psLua5QWmifykVbPyCDJ3gube4GHet + tXZZM7Xrj6d7Z3u/W8896dVVpd5rMbCaa3k1k25M88OMPcjDew64AAAA =

Ich habe Unicode in ASCII, aber das Ergebnis ist immer noch zu groß geändert (128)

H4sIAAAAAAAEAA3KyxGAMAgFwF44y0w + JAEbsAILICSvCcfedc/70EUnaYEq0FiyVJa + wdoj2LNZThDvs9FB918Xqu0ag4H1Vy3GbrG4jImYSyRVp/cDp8EZE1cAAAA =

public static string Compress(this string s) 
{ 
    var bytes = Encoding.ASCII.GetBytes(s); 
    using (var msi = new MemoryStream(bytes)) 
    using (var mso = new MemoryStream()) 
    { 
     using (var gs = new GZipStream(mso, CompressionMode.Compress)) 
     { 
      msi.CopyTo(gs); 

     } 
     return Convert.ToBase64String(mso.ToArray()); 
    } 
} 
+0

Haben Sie die Anzahl der Bytes vor dem Konvertieren in Base64 verglichen? Wenn ich mich richtig erinnere Base64 konvertiert jeden 6-Bit-Chunk zu einem Zeichen https://en.wikipedia.org/wiki/Base64 – KMoussa

+0

@KMoussa danke für die Antwort. Ich habe meinen Code hinzugefügt –

+0

Ja, ich benutze ToBase64, aber ich habe auch getestet System.Text.Encoding.ASCII.GetString (byteArray); –

Antwort

1

Gzip ist nicht nur Komprimierung, sondern ein komplettes Dateiformat - das bedeutet, dass es zusätzliche Strukturen hinzufügt, die normalerweise in Bezug auf ihre Größe vernachlässigt werden können. Wenn Sie jedoch kleine Strings komprimieren, können sie den gesamten gzip-Stream in die Luft jagen.

Der Standard-GZIP-Header zum Beispiel hat 10 Bytes und seine Fußzeile ist 8 Bytes lang.

Daher nehmen Sie jetzt Ihre gzip komprimierte Ergebnis im Raw-Format (nicht die aufgeblähten bis Base64-codiert) Sie werden sehen, dass es 95 Bytes hat.

Daher machen die 18 Bytes für Header und Hooter bereits fast 20% des Ausgangs!

+0

Danke Robert, was soll ich stattdessen machen? –

+0

Konvertieren Sie Ihre Daten nicht in eine Zeichenfolge und verwenden Sie stattdessen das eigentliche Format. Ihre Daten enthalten beispielsweise zwei Daten, die wie UUID aussehen. In der String-Darstellung sind sie 36 Zeichen, in der Binärdarstellung (nur die Zahl) sind es nur 16 Byte. Oder versuchen Sie, einen Komprimierungsalgorithmus zu finden, der keine zusätzlichen Daten hinzufügt (aber mehr als 10-15% Komprimierung werden Sie nicht bekommen, wie gzip zeigt). – Robert

Verwandte Themen