Comprimir y descomprimir una cadena en C#

Saad Aslam 12 octubre 2023
  1. Definición de compresión
  2. los Algoritmos de Compresión de Datos .NET en C#
  3. Usa GZip para comprimir una cadena en C#
  4. Usa GZip para descomprimir una cadena en C#
Comprimir y descomprimir una cadena en C#

Este artículo demostrará cómo podemos aplicar métodos de compresión al sistema de archivos System.IO.

El espacio de nombres Compression puede comprimir y descomprimir el valor de una cadena. La compresión de los valores debería resultar en una reducción considerable del tamaño en bytes.

Definición de compresión

En física, la compresión se refiere a una disminución de tamaño resultante de las fuerzas que actúan hacia el interior de una masa. Cuando hablamos de compresión de datos, nos referimos a cambiar los datos a un formato más compacto sin ninguna pérdida perceptible de contenido.

La compresión de datos es el proceso de codificar información ya existente en tan pocos bits como sea humanamente práctico utilizando algoritmos. La eficacia de varios algoritmos varía en diversos grados.

Aún así, generalmente implican compromisos en términos del tiempo necesario para comprimir los datos o la cantidad de potencia de procesamiento requerida por la CPU.

los Algoritmos de Compresión de Datos .NET en C#

Hay muchos métodos de compresión alternativos, pero por el bien de esta discusión, nos concentraremos en GZip. Aunque es factible utilizar una biblioteca de terceros como SharpZipLib, utilizaremos la clase GZipStream nativa de .NET Framework y que se encuentra en el espacio de nombres System.IO.Compression.

Además, haremos mucho hincapié en la compresión y descompresión de datos de cadenas; los procedimientos para tratar con otros tipos, como conjuntos de bytes y flujos, se modificarán un poco.

Usa GZip para comprimir una cadena en C#

La implementación más básica de GZipStream requiere que los usuarios proporcionen una transmisión subyacente y una opción de compresión como entradas. El modo de compresión dicta si desea comprimir o descomprimir los datos; el flujo subyacente se cambia según el método de compresión.

El siguiente código usa un flujo de memoria como nuestro flujo de salida subyacente. El flujo de salida está envuelto en un contenedor GZipStream.

Cuando enviamos nuestros datos de entrada al GZipStream, los datos viajan por la canalización hasta el flujo de salida en su forma comprimida. Podemos garantizar que los datos se limpien colocando la acción Write en su propio bloque using.

El código del método save() está disponible en el código fuente al final de este artículo.

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

Usa GZip para descomprimir una cadena en C#

Al descomprimir datos, el flujo que se descomprime se convierte en un flujo de entrada. El GZipStream continuará encerrándolo, pero el flujo ahora se invertirá de modo que la lectura de datos del GZipStream convertirá los datos comprimidos en datos sin comprimir.

El modo CompressionMode.Decompress se utiliza para descomprimir una cadena.

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

Código fuente completo para comprimir y descomprimir una cadena 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");
  }
}

Producción :

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

Artículo relacionado - Csharp String