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

4 Comentários

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
Se você gostou do post, deixe um comentário ou assine nosso RSS RSS.

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
, , , ,

4 Respostas to “Compressão de (Compactar) Dados”


  1. Jéter

    1 year ago

    Excelente post!!! Vou ser divulgador fiel desse site.


  2. Elton

    4 months ago

    Não sei porque, mas em meu projeto o arquivo ficou d tamanho maior que o original.


  3. Guilherme Bacellar

    3 months ago

    Olá Elton,

    isso pode acontecer mas só em arquivos pequenos.

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