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:
- Compressão de (Compactar) ViewState
- Calculando CRC de Strings (Texto), Array’s e Arquivos
- Converter um Array de Bytes para String e String para Array de Bytes
- Convertendo String Delimitada por Tamanho (Trancode) em Array
- Convertendo Caminhos Absolutos e URL’s Absolutas para Caminhos Relativos e URL’s Relativas
- Algoritmo para Validação de CPF
- Abrindo Arquivos de Texto e Lendo Todo o Conteúdo



April 17th, 2009 at 7:13 PM
[...] Para utilizar o código abaixo será necessário o código do artigo sobre compressão. Para ver o artigo, clique aqui. [...]