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