Vamos a ver dos funciones que te van a permitir comprimir y descomprimir cadenas de texto. Esto puede serte útil para aligerar el peso de la información al almacenar información en un campo de una base de datos o para que puedas crear tus propios archivos *.zip desde tu aplicación.
Deberás incluir un par de directivas using a System.IO y a System.IO.Compression;
El código de las funciones:
/// <summary>
/// Obtiene una cadena de texto comprimida
/// </summary>
/// <param name=”Value“>Cadena de texto a comprimir</param>
/// <returns></returns>
public static string Zip(string Value)
{
if (string.IsNullOrEmpty(Value))
{
return null;
}
MemoryStream ms = null;
GZipStream sw = null;
try
{
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
sw = new GZipStream(ms, CompressionMode.Compress);
sw.Write(byteArray, 0, byteArray.Length);
sw.Close();
byteArray = ms.ToArray();
return System.Convert.ToBase64String(byteArray);
}
catch (Exception ex)
{
MessageBox.Show(“Error: “ + Environment.NewLine+ ex.Message, “Test”,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
finally
{
sw.Dispose();
ms.Close();
ms.Dispose();
}
}
/// <summary>
/// Descomprime una cadena de texto en formato comprimido
/// </summary>
/// <param name=”Compressedvalue“></param>
/// <returns>La cadena descomprimida o null si hay errores</returns>
public static string Unzip(string Compressedvalue)
{
MemoryStream stream = null;
Stream sourceStream = null;
MemoryStream memoryStream = null;
try
{
byte[] byteArray = System.Convert.FromBase64String(Compressedvalue);
stream = new System.IO.MemoryStream(byteArray);
sourceStream = stream;
if (sourceStream == null || !sourceStream.CanRead)
{
MessageBox.Show(“Imposible leer la cadena comprimida recibida!!”, “Test”,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
memoryStream = new System.IO.MemoryStream();
int bufferSize = 65536;
using (GZipStream gzipStream = new GZipStream(sourceStream, CompressionMode.Decompress))
{
byte[] buffer = new byte[bufferSize + 1];
int bytesRead = 0;
do
{
bytesRead = gzipStream.Read(buffer, 0, bufferSize);
memoryStream.Write(buffer, 0, bytesRead);
}
while (bytesRead == bufferSize);
}
var btArraymemoryStream = memoryStream.ToArray();
return System.Text.Encoding.UTF8.GetString(btArraymemoryStream);
}
catch (Exception ex)
{
MessageBox.Show(“Error: “ + Environment.NewLine + ex.Message, “Test”,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
finally
{
stream.Dispose();
sourceStream.Dispose();
memoryStream.Dispose();
}
}
Para poner a prueba la función puedes crear un formulario parecido al siguiente:
A continuación el código para los eventos de los botones:
private void btZip_Click(object sender, EventArgs e)
{
this.txtZipedText.Clear();
if (!string.IsNullOrEmpty(this.txtUnzipedText.Text))
{
this.txtZipedText.Text = MyClase.Zip(this.txtUnzipedText.Text);
}
}
private void btUnzip_Click(object sender, EventArgs e)
{
this.txtUnzipedText.Clear();
if (!string.IsNullOrEmpty(this.txtZipedText.Text))
{
this.txtUnzipedText.Text = MyClase.Unzip(this.txtZipedText.Text);
}
}
Si todo ha salido bien deberías obtener un resultado parecido al siguiente:
Ponlo a prueba, piensa en cómo mejorarlo y comparte con nosotros tus progresos.