GzipStream Decompress Methode vorhanden, brauche es umgekehrt.

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    GzipStream Decompress Methode vorhanden, brauche es umgekehrt.

    Hallo, ich wieder,

    ich stehe ein wenig auf dem Schlauch. Folgende Methode dekomprimiert einen Base64 encodeten String:

    C#-Quellcode

    1. public string UnZipFromBase64(string Compressedvalue)
    2. {
    3. byte[] buffer = Convert.FromBase64String(Compressedvalue);
    4. MemoryStream memoryStream = new MemoryStream(buffer);
    5. Stream stream = memoryStream;
    6. if (stream == null)
    7. {
    8. throw new ArgumentException();
    9. }
    10. if (!stream.CanRead)
    11. {
    12. throw new ArgumentException();
    13. }
    14. MemoryStream memoryStream2 = new MemoryStream();
    15. using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress))
    16. {
    17. byte[] buffer2 = new byte[31457280];
    18. int num;
    19. do
    20. {
    21. num = gzipStream.Read(buffer2, 0, 31457280);
    22. }
    23. while (num == 31457280);
    24. memoryStream2.Write(buffer2, 0, num);
    25. }
    26. byte[] bytes = memoryStream2.ToArray();
    27. memoryStream.Close();
    28. memoryStream.Dispose();
    29. stream.Close();
    30. stream.Dispose();
    31. memoryStream2.Close();
    32. memoryStream2.Dispose();
    33. return Encoding.UTF8.GetString(bytes);
    34. }


    Diese Dekomprimierfunktion lag mir vor, ich brauche das Gegenstück dazu, also wie man den dekomprimierten String wieder komprimiert.
    Ich weiß nicht warum diese Funktion so hässlich ist mit den fixen Werten darin. Das ist wie gesagt nicht meine Funktion, so ist sie aber in einem Spiel drin und ich muss eine Komprimierfunktion haben, die genau darauf abgestimmt ist.

    Ich habe folgendes entworfen:

    C#-Quellcode

    1. public static string ZipToBase64(string UncompressedValue)
    2. {
    3. byte[] buffer = Encoding.UTF8.GetBytes(UncompressedValue);
    4. string result = string.Empty;
    5. using (var memoryStream = new MemoryStream())
    6. using (var zipStream = new GZipStream(memoryStream, CompressionMode.Compress))
    7. {
    8. zipStream.Write(buffer, 0, buffer.Length);
    9. result = Convert.ToBase64String(memoryStream.ToArray());
    10. }
    11. return result;
    12. }


    Nun kann ich leider nicht nachvollziehen warum das ganze nicht funktioniert. Mit folgendem Beispiel habe ich das ganze ausprobiert:

    C#-Quellcode

    1. string test = "hallo welt";
    2. Console.WriteLine("hallo welt plain => {0}", test);
    3. string b64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(test));
    4. Console.WriteLine("hallo welt base64 => {0}", b64);
    5. string b64compressed = ZipToBase64(b64);
    6. Console.WriteLine("hallo welt b64compressed => {0}", b64compressed);
    7. b64 = UnZipFromBase64(b64compressed);
    8. Console.WriteLine("hallo welt base64 => {0}", b64);
    9. test = Encoding.UTF8.GetString(Convert.FromBase64String(b64));
    10. Console.WriteLine("hallo welt plain: {0}", test);
    11. Console.ReadLine();


    Ich hoffe mir kann jemand den Abend retten, weil ich offensichtlich gerade zu blöd dafür bin.

    PS: Folgende Ausgabe kommt:


    Danke im Voraus
    Hab's gelöst:

    C#-Quellcode

    1. public static string ZipToBase64(string text)
    2. {
    3. UTF8Encoding uniEncode = new UTF8Encoding();
    4. byte[] bytesToCompress = uniEncode.GetBytes(text);
    5. string b64 = string.Empty;
    6. using (var fileToCompress = new MemoryStream())
    7. {
    8. using (GZipStream compressionStream = new GZipStream(fileToCompress, CompressionMode.Compress))
    9. {
    10. compressionStream.Write(bytesToCompress, 0, bytesToCompress.Length);
    11. }
    12. b64 = Convert.ToBase64String(fileToCompress.ToArray());
    13. }
    14. return b64;
    15. }
    guck - so wärs noch bisserl merh auf den Punkt gebracht:

    C#-Quellcode

    1. public static string ZipToBase64(string text) {
    2. using (var ms = new MemoryStream()) {
    3. using (var strm = new GZipStream(ms, CompressionMode.Compress)) {
    4. using (var wr = new StreamWriter(strm, new UTF8Encoding(false))) {
    5. wr.Write(text);
    6. }
    7. return Convert.ToBase64String(ms.ToArray());
    8. }
    9. }
    10. }

    Und die annere Methode sollte sehr ähnlich aussehen - spiegelbildlich halt.

    Jo - so nämlich:

    C#-Quellcode

    1. public static string UnZipFromBase64(string Compressedvalue) {
    2. byte[] buffer = Convert.FromBase64String(Compressedvalue);
    3. using (var stream = new MemoryStream(buffer)) {
    4. using (var gzipStream = new GZipStream(stream, CompressionMode.Decompress)) {
    5. using (var rd = new StreamReader(gzipStream, Encoding.UTF8)) return rd.ReadToEnd();
    6. }
    7. }
    8. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()