Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Keyen Night en 23 Junio 2012, 21:30 pm



Título: DeflateStream - Extraña Perdida de Datos
Publicado por: Keyen Night en 23 Junio 2012, 21:30 pm
Estoy diseñando una clase que guarda información en un archivo y utiliza DeflateStream como método de compresión, no hay casi información de como comprimir datos en forma de Bytes(), hay mucha documentación de ir directamente al trabajo con archivos, entonces diseñe esta función que al parecer funciona correctamente, pero se pierden algunos Bytes del final de la información comprimida y no encuentro el error por ningún lado, quizás es mal uso de DeflateStream.

Para probar la perdida de los datos hice esta prueba:

Código
  1. Imports System.IO, System.IO.Compression, System.Text, System.Security.Cryptography
  2.  
  3. Module Module1
  4.  
  5. #Region " Algoritmo de DeCompresión Deflate "
  6.  
  7.    Public Function DeflateDeCompress(ByVal Data As Byte(), _
  8.                                      ByVal Action As CompressionMode) As Byte()
  9.  
  10.        DeflateDeCompress = Nothing
  11.  
  12.        Dim ResultStream As MemoryStream = Nothing
  13.        Dim DeCompresser As DeflateStream = Nothing
  14.        Dim A As Integer, B As New List(Of Byte)
  15.  
  16.        Try
  17.  
  18.            If Action = CompressionMode.Compress Then
  19.                ResultStream = New MemoryStream
  20.                DeCompresser = New DeflateStream(ResultStream, CompressionMode.Compress)
  21.                DeCompresser.Write(Data, 0, Data.Length)
  22.                ResultStream.Position = 0
  23.                DeflateDeCompress = ResultStream.ToArray
  24.            Else
  25.                ResultStream = New MemoryStream(Data)
  26.                ResultStream.Position = 0
  27.                DeCompresser = New DeflateStream(ResultStream, CompressionMode.Decompress)
  28.                DeflateDeCompress = New Byte() {}
  29.  
  30.                DeCompresser.ReadByte() : A = DeCompresser.ReadByte
  31.  
  32.                While A <> -1
  33.                    B.Add(CByte(A))
  34.                    A = DeCompresser.ReadByte
  35.                End While
  36.  
  37.                DeflateDeCompress = B.ToArray : B.Clear()
  38.  
  39.            End If
  40.  
  41.            If DeCompresser IsNot Nothing Then
  42.                DeCompresser.Dispose()
  43.            End If
  44.  
  45.            If ResultStream IsNot Nothing Then
  46.                ResultStream.Dispose()
  47.            End If
  48.  
  49.        Catch ex As Exception
  50.            Return Nothing
  51.        End Try
  52.  
  53.    End Function
  54.  
  55. #End Region
  56.  
  57.    Public Function MD5_String(ByVal Data As Byte()) As String
  58.  
  59.        Return BitConverter.ToString(MD5.Create.ComputeHash(Data)).Replace("-", "").ToLower
  60.  
  61.    End Function
  62.  
  63.    Sub Main()
  64.  
  65.        Dim x As String = "C:\ejemplo.txt"
  66.        Dim y As Byte() = File.ReadAllBytes(x)
  67.        Dim z As Byte() = DeflateDeCompress(y, CompressionMode.Compress)
  68.        Dim a As Byte() = DeflateDeCompress(z, CompressionMode.Decompress)
  69.  
  70.        Console.WriteLine("Archivo de Entrada: {0}", x)
  71.        Console.WriteLine("Tamaño de Entrada: {0} bytes", y.Length)
  72.        Console.WriteLine("MD5-{0}", MD5_String(y))
  73.        Console.WriteLine()
  74.        Console.WriteLine("Tamaño Comprimido: {0} bytes ({1}%)", z.Length, Math.Round(z.Length / y.Length * 100 - 100, 2))
  75.        Console.WriteLine("MD5-{0}", MD5_String(z))
  76.        Console.WriteLine()
  77.        Console.WriteLine("Tamaño Descomprimido: {0} bytes", a.Length)
  78.        Console.WriteLine("MD5-{0}", MD5_String(a))
  79.        Console.WriteLine()
  80.        Console.WriteLine("Perdida de {0} bytes", y.Length - a.Length)
  81.  
  82.        Erase y, z, a
  83.  
  84.        Console.Read()
  85.  
  86.    End Sub
  87.  
  88. End Module
  89.  

Gracias de antemano :)