Recentemente precisava compactar um texto muito grande de forma simples e eficiente, o principal objetivo era diminuir o tamanho do texto de 145kb, não salvando arquivos no disco, apenas compactar de um lado e descompactar do outro lado, sem geração de arquivos fisicos, nesse momento lembrei do GZipStream, após realizar algumas implementações e testes consegui deixar o texto com 5kb, objetivo alcançado, existem outras formas de compactação e até mesmo pelo IIS, mas no cenário proposto tivemos sucesso.

Segue abaixo a implementação:

Exemplo da chamada:


string textoCompactado = CompressUtil.Compress("Fabrizio Gianfratti Manes");
string textoDesCompactado = CompressUtil.DecompressText(textoCompactado);

Implementação da classe:
Obs: inserir a referencia: using System.IO.Compression;

public class CompressUtil
{
/// <summary> Compacta uma string </summary>
/// <param name=”inputText”> Texto de entrada </param>
/// <returns> Texto compactado Base64 encoded </returns>
public static string Compress(string inputText)
{
return Compress(System.Text.Encoding.UTF8.GetBytes(inputText));
}

/// <summary> Compacta uma string </summary>
/// <param name=”inputBytes”> Texto de entrada </param>
/// <returns> Texto compactado Base64 encoded </returns>
public static string Compress(byte[] inputBytes)
{
byte[] compressed;

using (MemoryStream ms = new MemoryStream())
{
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress))
{
zip.Write(inputBytes, 0, inputBytes.Length);
zip.Close();

compressed = ms.ToArray();
}
}

return Convert.ToBase64String(compressed);
}

/// <summary> Descompacta uma string. </summary>
/// <param name=”compressedText”> Texto compactado Base64 encoded </param>
/// <returns> descompacta um texto </returns>
public static string DecompressText(string compressedText)
{
return System.Text.Encoding.UTF8.GetString(DecompressBytes(compressedText));
}

/// <summary> Descompacta uma string </summary>
/// <param name=”compressedText”> Texto compactado Base64 encoded </param>
/// <returns> descompacta byte array </returns>
public static byte[] DecompressBytes(string compressedText)
{
byte[] bytes = Convert.FromBase64String(compressedText);
byte[] outputBytes;

using (MemoryStream inputStream = new MemoryStream(bytes))
{
using (GZipStream zip = new GZipStream(inputStream, CompressionMode.Decompress))
{
using (MemoryStream outputStream = new MemoryStream())
{
zip.CopyTo(outputStream);

outputBytes = outputStream.ToArray();
}
}
}

return outputBytes;
}
}

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Post Navigation