Komprimieren und Dekomprimieren einer Zeichenfolge in C#

Saad Aslam 12 Oktober 2023
  1. Definition von Komprimierung
  2. die .NET-Datenkompressionsalgorithmen in C#
  3. Verwenden von GZip zum Komprimieren einer Zeichenkette in C#
  4. Verwenden von GZip zum Dekomprimieren eines Strings in C#
Komprimieren und Dekomprimieren einer Zeichenfolge in C#

Dieser Artikel zeigt, wie wir Komprimierungsmethoden auf das Dateisystem System.IO anwenden können.

Der Namespace Compression kann den Wert einer Zeichenkette komprimieren und dekomprimieren. Das Komprimieren der Werte sollte zu einer erheblichen Größenreduzierung in Bytes führen.

Definition von Komprimierung

Kompression bezeichnet in der Physik eine Größenabnahme, die durch nach innen auf eine Masse einwirkende Kräfte entsteht. Wenn wir von Datenkomprimierung sprechen, beziehen wir uns auf die Umwandlung von Daten in ein kompakteres Format ohne erkennbaren Inhaltsverlust.

Datenkomprimierung ist der Prozess, bereits vorhandene Informationen mithilfe von Algorithmen in so wenige Bits zu codieren, wie es für Menschen praktikabel ist. Die Wirksamkeit verschiedener Algorithmen variiert in unterschiedlichem Maße.

Dennoch beinhalten sie im Allgemeinen Kompromisse in Bezug auf die Zeit, die zum Komprimieren der Daten benötigt wird, oder die Menge an Rechenleistung, die von der CPU benötigt wird.

die .NET-Datenkompressionsalgorithmen in C#

Es gibt viele alternative Komprimierungsmethoden, aber für diese Diskussion konzentrieren wir uns auf GZip. Obwohl es möglich ist, eine Bibliothek eines Drittanbieters wie SharpZipLib zu verwenden, verwenden wir die Klasse GZipStream, die für das .NET Framework nativ ist und sich im Namensraum System.IO.Compression befindet.

Darüber hinaus werden wir das Komprimieren und Dekomprimieren von String-Daten stark betonen; die Prozeduren für den Umgang mit anderen Arten wie Byte-Arrays und Streams werden etwas modifiziert.

Verwenden von GZip zum Komprimieren einer Zeichenkette in C#

Die einfachste Implementierung von GZipStream erfordert, dass Benutzer einen zugrunde liegenden Stream und eine Komprimierungsoption als Eingaben bereitstellen. Der Komprimierungsmodus gibt vor, ob Sie die Daten komprimieren oder dekomprimieren möchten; Der zugrunde liegende Stream wird basierend auf der Komprimierungsmethode geändert.

Der folgende Code verwendet einen Speicherstream als unseren zugrunde liegenden Ausgabestream. Der Ausgabestream wird in einen GZipStream-Container verpackt.

Wenn wir unsere Eingabedaten an den GZipStream senden, wandern die Daten in komprimierter Form durch die Pipeline zum Ausgabestrom. Wir können garantieren, dass die Daten bereinigt werden, indem wir die Aktion Write in einen eigenen using-Block setzen.

Der Methodencode save() ist im Quellcode am Ende dieses Artikels verfügbar.

public static byte[] Compress(string str) {
  var bytes = Encoding.UTF8.GetBytes(str);

  using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
      save(msi, gZipStream);
    }

    return memoryStream.ToArray();
  }
}

Verwenden von GZip zum Dekomprimieren eines Strings in C#

Beim Dekomprimieren von Daten wird der dekomprimierte Stream zu einem Eingabestream. Der GZipStream wird es weiterhin umschließen, aber der Fluss wird jetzt umgekehrt, sodass das Lesen von Daten aus dem GZipStream die komprimierten Daten in unkomprimierte Daten umwandelt.

Der Modus CompressionMode.Decompress dient zum Dekomprimieren eines Strings.

public static string Decompress(byte[] bytes) {
  using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
    using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
      save(gZipStream, memoryStream);
    }

    return Encoding.UTF8.GetString(memoryStream.ToArray());
  }
}

Vollständiger Quellcode zum Komprimieren und Dekomprimieren eines Strings in C#

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

class HelloWorld {
  public static void save(Stream source, Stream destination) {
    byte[] bytes = new byte[4096];

    int count;

    while ((count = source.Read(bytes, 0, bytes.Length)) != 0) {
      destination.Write(bytes, 0, count);
    }
  }

  public static byte[] Compress(string str) {
    var bytes = Encoding.UTF8.GetBytes(str);

    using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
      using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
        save(msi, gZipStream);
      }
      return memoryStream.ToArray();
    }
  }

  public static string Decompress(byte[] bytes) {
    using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
      using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
        save(gZipStream, memoryStream);
      }

      return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
  }

  static void Main(string[] args) {
    byte[] string1 = Compress("stringstringstringstringstringstringstringstring");
    Console.WriteLine("Zipped Size: " + string1.Length + " bytes");
    string string2 = Decompress(string1);
    Console.WriteLine("Unzipped Size: " + string2.Length + " bytes");
  }
}

Ausgabe:

Zipped Size: 29 bytes
Unzipped Size: 48 bytes
Autor: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

Verwandter Artikel - Csharp String