Comprimir y descomprimir cadenas de texto

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.

Scroll al inicio
Abrir chat
1
Hola
¿En qué podemos ayudarte?