Escrito em March 18th, 2009 as 7:05 pm por Guilherme Bacellar

1 Comentário

Diversas vezes já me deparei na situação de precisar compactar conteúdo nos sistemas .NET e sempre tive provlema para encontrar um algorítimo para fazer-lo corretamente.

Aproveito agora para compartilhar a classe de compressão para Array de Bytes que eu recentemente aperfeiçoei.

C#

using System.IO;
using System.IO.Compression;

namespace CompressorGenerico
{
    /// <summary>
    /// Classe de Compressão
    /// </summary>
    public class Compressor
    {
        /// <summary>
        /// Comprime um Array de Bytes
        /// </summary>
        /// <param name="data">Array de Bytes a ser Compactado</param>
        /// <returns>Array de Bytes Compactado</returns>
        public byte[] Compress(byte[] data)
        {
            // Cria Objetos
            MemoryStream outputMemoryStream;
            GZipStream gZipStream;

            // Inicializa MemoryStream
            using (outputMemoryStream = new MemoryStream())
            {
                // Inicializa Stream de Compressão
                using (gZipStream = new GZipStream(outputMemoryStream, CompressionMode.Compress, true))
                {
                    gZipStream.Write(data, 0, data.Length);
                }
            }

            // Retorna o Array Comprimido
            return outputMemoryStream.ToArray();
        }

        /// <summary>
        /// Descomprime um Array de Bytes
        /// </summary>
        /// <param name="data">Array de Bytes a Compactar</param>
        /// <returns>Array de Bytes Descompactado</returns>
        public byte[] Decompress(byte[] data)
        {
            // Cria Objetos
            MemoryStream inputMemoryStream;
            MemoryStream outputMemoryStream;
            GZipStream gZipStream;
            byte[] buff;
            int read;

            // Inicializa o MemoryStream de Inicialização
            using (inputMemoryStream = new MemoryStream())
            {
                // Escreve o Array de Entrada no MemoryStream
                inputMemoryStream.Write(data, 0, data.Length);

                // Ajusta Ponteiro de Posição
                inputMemoryStream.Position = 0;

                // Inicializa Stream de Descompressão
                using (gZipStream = new GZipStream(inputMemoryStream, CompressionMode.Decompress, true))
                {
                    // Inicializa Stream de Resultado
                    outputMemoryStream = new MemoryStream();

                    // Inicializa Buffer (64 Bytes)
                    buff = new byte[64];

                    // Executa 1º Leitura dos Dados para o Buffer
                    read = gZipStream.Read(buff, 0, buff.Length);

                    // Executa Enquando Ouver Dados a Serem Lidos
                    while (read > 0)
                    {
                        // Escreve o Bloco de Código Descomprimido para o Stream de Resultado
                        outputMemoryStream.Write(buff, 0, read);

                        // Executa Leituras Subsequentes.
                        read = gZipStream.Read(buff, 0, buff.Length);
                    }
                }
            }

            // Retorna o Stream Descompactado
            return outputMemoryStream.ToArray();
        }
    }
}

VB.NET

Imports System.IO.Compression
Imports System.IO

Namespace CompressorGenerico

    ''' <summary>
    ''' Classe de Compressão
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Compressor

        ''' <summary>
        ''' Comprime um Array de Bytes
        ''' </summary>
        ''' <param name="data">Array de Bytes a ser Compactado</param>
        ''' <returns>Array de Bytes Compactado</returns>
        Public Function Compress(ByVal data As Byte()) As Byte()
            ' Cria Objetos
            Dim outputMemoryStream As MemoryStream
            Dim gZipStream As GZipStream

            ' Inicializa MemoryStream
            outputMemoryStream = New MemoryStream()
            Using (outputMemoryStream)

                ' Inicializa Stream de Compressão
                gZipStream = New GZipStream(outputMemoryStream, CompressionMode.Compress, True)

                Using (gZipStream)
                    gZipStream.Write(data, 0, data.Length)
                End Using

            End Using

            ' Retorna o Array Comprimido
            Return outputMemoryStream.ToArray()

        End Function
        ''' <summary>
        ''' Descomprime um Array de Bytes
        ''' </summary>
        ''' <param name="data">Array de Bytes a Compactar</param>
        ''' <returns>Array de Bytes Descompactado</returns>
        Public Function Decompress(ByVal data As Byte()) As Byte()

            ' Cria Objetos
            Dim inputMemoryStream As MemoryStream
            Dim outputMemoryStream As MemoryStream
            Dim GZipStream As GZipStream
            Dim buff As Byte()
            Dim read As Integer

            ' Inicializa o MemoryStream de Inicialização
            inputMemoryStream = New MemoryStream()
            Using (inputMemoryStream)

                ' Escreve o Array de Entrada no MemoryStream
                inputMemoryStream.Write(data, 0, data.Length)

                ' Ajusta Ponteiro de Posição
                inputMemoryStream.Position = 0

                ' Inicializa Stream de Descompressão
                GZipStream = New GZipStream(inputMemoryStream, CompressionMode.Decompress, True)
                Using (GZipStream)

                    ' Inicializa Stream de Resultado
                    outputMemoryStream = New MemoryStream()

                    ' Inicializa Buffer (64 Bytes)
                    ReDim buff(64)

                    ' Executa 1º Leitura dos Dados para o Buffer
                    read = GZipStream.Read(buff, 0, buff.Length)

                    ' Executa Enquando Ouver Dados a Serem Lidos
                    While (read > 0)

                        ' Escreve o Bloco de Código Descomprimido para o Stream de Resultado
                        outputMemoryStream.Write(buff, 0, read)

                        ' Executa Leituras Subsequentes.
                        read = GZipStream.Read(buff, 0, buff.Length)

                    End While

                End Using
            End Using

            ' Retorna o Stream Descompactado
            Return outputMemoryStream.ToArray()

        End Function

    End Class

End Namespace

Posts Relacionados:

  1. Compressão de (Compactar) ViewState
  2. Calculando CRC de Strings (Texto), Array’s e Arquivos
  3. Converter um Array de Bytes para String e String para Array de Bytes
  4. Convertendo String Delimitada por Tamanho (Trancode) em Array
  5. Convertendo Caminhos Absolutos e URL’s Absolutas para Caminhos Relativos e URL’s Relativas
  6. Algoritmo para Validação de CPF
  7. Abrindo Arquivos de Texto e Lendo Todo o Conteúdo
, , , ,

1 Reposta to “Compressão de (Compactar) Dados”

1 Trackbacks For This Post

  1. Compressão de (Compactar) ViewState | .Net Max Says:

    [...] Para utilizar o código abaixo será necessário o código do artigo sobre compressão. Para ver o artigo, clique aqui. [...]

Deixa uma Resposta

znjdb32s6g