Compresser et décompresser une chaîne en C#

Saad Aslam 12 octobre 2023
  1. Définition de la compression
  2. les algorithmes de compression de données .NET en C#
  3. Utiliser GZip pour compresser une chaîne en C#
  4. Utiliser GZip pour décompresser une chaîne en C#
Compresser et décompresser une chaîne en C#

Cet article montrera comment nous pouvons appliquer des méthodes de compression au système de fichiers System.IO.

L’espace de noms Compression peut compresser et décompresser la valeur d’une chaîne. La compression des valeurs devrait entraîner une réduction considérable de la taille en octets.

Définition de la compression

En physique, la compression fait référence à une diminution de taille résultant de forces agissant vers l’intérieur sur une masse. Lorsque nous parlons de compression de données, nous nous référons à la modification des données dans un format plus compact sans aucune perte perceptible de contenu.

La compression des données est le processus d’encodage d’informations déjà existantes en aussi peu de bits qu’il est humainement pratique à l’aide d’algorithmes. L’efficacité de divers algorithmes varie à des degrés divers.

Pourtant, ils impliquent généralement un compromis en termes de temps nécessaire pour compresser les données ou de quantité de puissance de traitement requise par le CPU.

les algorithmes de compression de données .NET en C#

Il existe de nombreuses méthodes de compression alternatives, mais pour les besoins de cette discussion, nous nous concentrerons sur GZip. Bien qu’il soit possible d’utiliser une bibliothèque tierce telle que SharpZipLib, nous utiliserons la classe GZipStream native du .NET Framework et trouvée dans l’espace de noms System.IO.Compression.

De plus, nous mettrons fortement l’accent sur la compression et la décompression des données de chaîne ; les procédures de traitement des autres types, tels que les tableaux d’octets et les flux, seront quelque peu modifiées.

Utiliser GZip pour compresser une chaîne en C#

L’implémentation la plus basique de GZipStream nécessite que les utilisateurs fournissent un flux sous-jacent et une option de compression en tant qu’entrées. Le mode de compression indique si vous souhaitez compresser ou décompresser les données ; le flux sous-jacent est modifié en fonction de la méthode de compression.

Le code ci-dessous utilise un flux de mémoire comme flux de sortie sous-jacent. Le flux de sortie est encapsulé dans un conteneur GZipStream.

Lorsque nous envoyons nos données d’entrée dans le GZipStream, les données parcourent le pipeline vers le flux de sortie sous leur forme compressée. Nous pouvons garantir que les données sont nettoyées en plaçant l’action Write dans son propre bloc using.

Le code de la méthode save() est disponible dans le code source à la fin de cet article.

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();
  }
}

Utiliser GZip pour décompresser une chaîne en C#

Lors de la décompression des données, le flux en cours de décompression devient un flux d’entrée. Le GZipStream continuera de l’enfermer, mais le flux sera désormais inversé de sorte que la lecture des données du GZipStream convertira les données compressées en données non compressées.

Le mode CompressionMode.Decompress permet de décompresser une chaîne.

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());
  }
}

Code source complet pour compresser et décompresser une chaîne en 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");
  }
}

Production:

Zipped Size: 29 bytes
Unzipped Size: 48 bytes
Auteur: 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

Article connexe - Csharp String