GZipStream: Problema con numero magico

Iniciado por Sancho.Mazorka, 2 Noviembre 2010, 07:28 AM

0 Miembros y 2 Visitantes están viendo este tema.

Sancho.Mazorka

Hola muchach@s, necesito descomprimir un string comprimido en gzip, y encontre este source que estaba en C#.NET pero lo converti a VB.NET, el problema se genera en el

Código (vbnet) [Seleccionar]
zip.Read(buffer, 0, buffer.Length)

y me genera este error

El número mágico del encabezado de GZip no es correcto. Asegúrese de que está pasando una secuencia GZip.

Busque que era numero magico, y son los primeros bytes de todo archivo, que ayudan a identificar de que tipo de archivo es. Ej: GIF87a es el "numero magico" de un tipo de GIF
http://es.wikipedia.org/wiki/N%C3%BAmero_m%C3%A1gico

Si guardo el contenido del gzip, en un fichero, y luego descomprimo con otra rutina similar, funciona de maravilla.

FUNCION PARA DESCOMPRIMIR UN STRING - FUNCIONA MAL
Código (vbnet) [Seleccionar]
   Private Function UnZip(ByVal compressedText As String) As String
       Dim gzBuffer As Byte() = System.Text.Encoding.ASCII.GetBytes(compressedText) 'Convert.FromBase64String(compressedText)
       Using ms As New MemoryStream()
           Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)
           ms.Write(gzBuffer, 4, gzBuffer.Length - 4)
           Dim buffer As Byte() = New Byte(msgLength - 1) {}
           ms.Position = 0

           Using zip As New GZipStream(ms, CompressionMode.Decompress)
                   zip.Read(buffer, 0, buffer.Length)
           End Using

           Return System.Text.Encoding.UTF8.GetString(buffer)
       End Using
   End Function


FUNCION PARA DESCOMPRIMIR UN ARCHIVO - FUNCIONA BIEN
Código (vbnet) [Seleccionar]
   Private Function DecompressFile(ByVal CompressedFilename As String, ByVal DecompressedFilename As String) As Boolean
       Try
           Dim [Stream] As FileStream = New FileStream(CompressedFilename, FileMode.Open)
           Dim [GZipStream] As GZipStream = New GZipStream([Stream], CompressionMode.Decompress)
           Dim sr As StreamReader = New StreamReader(CType([GZipStream], IO.Stream))

           My.Computer.FileSystem.WriteAllText(DecompressedFilename, sr.ReadToEnd(), False)
           sr.Close() : [Stream].Close()
           If File.Exists(DecompressedFilename) Then Return True
       Catch ex As IOException
           msgbox(ex.Message)
       Catch ex As Exception
           msgbox(ex.Message)
       End Try
       Return False
   End Function


Espero puedan ayudarme, muchas gracias.


Saludos, Sancho.Mazorka    :P
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



[D4N93R]

Puede que sea el Encoding. Échale un ojo a:

   
Código (vbnet,2,13) [Seleccionar]
Private Function UnZip(ByVal compressedText As String) As String
        Dim gzBuffer As Byte() = System.Text.Encoding.ASCII.GetBytes(compressedText) 'Convert.FromBase64String(compressedText)
        Using ms As New MemoryStream()
            Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4)
            Dim buffer As Byte() = New Byte(msgLength - 1) {}
            ms.Position = 0

            Using zip As New GZipStream(ms, CompressionMode.Decompress)
                    zip.Read(buffer, 0, buffer.Length)
            End Using

            Return System.Text.Encoding.UTF8.GetString(buffer)
        End Using
    End Function

Sancho.Mazorka

#2
A continuacion te listo como intente decodificar cada linea, donde tira el error, la excepcion que genera y el mensaje de error.

Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = System.Text.ASCIIEncoding.GetBytes(compressedText)

zip.Read(buffer, 0, buffer.Length)

Excepción del tipo 'System.IO.InvalidDataException' en System.dll
El número mágico del encabezado de GZip no es correcto. Asegúrese de que está pasando una secuencia GZip.





Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = System.Text.UnicodeEncoding.GetBytes(compressedText)

zip.Read(buffer, 0, buffer.Length)

Excepción del tipo 'System.IO.InvalidDataException' en System.dll
El número mágico del encabezado de GZip no es correcto. Asegúrese de que está pasando una secuencia GZip.





Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = System.Text.UTF32Encoding.GetBytes(compressedText)

zip.Read(buffer, 0, buffer.Length)

Excepción del tipo 'System.IO.InvalidDataException' en System.dll
El número mágico del encabezado de GZip no es correcto. Asegúrese de que está pasando una secuencia GZip.





Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = System.Text.UTF7Encoding.GetBytes(compressedText)

zip.Read(buffer, 0, buffer.Length)

Excepción del tipo 'System.IO.InvalidDataException' en System.dll
El número mágico del encabezado de GZip no es correcto. Asegúrese de que está pasando una secuencia GZip.





Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = System.Text.UTF8Encoding.GetBytes(compressedText)

Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)
Dim buffer As Byte() = New Byte(msgLength - 1) {}

'la variable msgLength toma este valor -1182735841

Excepción del tipo 'System.OverflowException' en Host Uploader.exe
La operación aritmética ha provocado un desbordamiento.





Código (vbnet) [Seleccionar]
Dim gzBuffer As Byte() = Convert.FromBase64String(compressedText)

Convert.FromBase64String(compressedText)

Excepción del tipo 'System.FormatException' en Host Uploader.exe
Carácter no válido en una cadena Base-64.





Gracias por la respuesta, si encontras la solucion te lo voy a agradecer mucho.

PD: Como remarcas una linea dentro del tag Codigo? como hiciste vos


Saludos, Sancho.Mazorka    :P
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



[D4N93R]

Remarcar lo haces así:
[code=csharp,1,4,5,7][/code]
En ese caso la Linea 1, 4 la 5 y la 7 se resaltan.

Continuando con el tema.

Ese texto que quieres descomprimir, de qué manera lo estás comprimiendo, ya que eso puede que esté afectando la forma final y obviamente no puede reversarse luego.

Sancho.Mazorka

Ahh ok, copado lo de remarcar, gracias!

Hago un GET a http://www.megaupload.com/ y en las cabeceras les digo que acepto gzip, entonces me devuelven en gzip (podria no hacerlo, pero sino es muucho mas lo que tengo que descargar. 11kb gzip vs. 73kb sin comprimir)

Estas son las cabeceras de respuesta del servidor, el cuerpo del mensaje es la web comprimida, la cual almaceno en un string y la paso directamente a la funcion Unzip

HTTP/1.1 200 OK
Date: Tue, 02 Nov 2010 17:03:53 GMT
Server: Apache
Set-Cookie: l=es; expires=Sun, 05-Mar-2017 12:37:13 GMT; path=/; domain=.megaupload.com
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 11707
Connection: close
Content-Type: text/html


Saludos, Sancho.Mazorka    :P
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



[D4N93R]

Sube el code a pastebin y postea el code. Es que no tengo tiempo de tirar un demo xP

Sancho.Mazorka

Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



[D4N93R]

Bueno disculpa, pero el code está un poco difícil de leer, y no puedo analizarlo todo por falta de tiempo.

Te recomiendo que intentes hacer Unit Testing o algo parecido para probar los resultados de cada método.

Un saludo.

Sancho.Mazorka

Ok, no hay drama, muchas gracias igual por la ayuda!

Por si tenes un tiempito, en el ws_dataarrival, esta la llamada a Unzip2() (lo marque con muchos numerales '#########) y al final del archivo principal estan todas las funciones que he ido probando, y te marque la que uso con numerales tambien.

Hay varios archivos, pero por ahora no son utilizados. Subi todo el proyecto asi te era mas comodo.


Saludos, Sancho.Mazorka    :P
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



[D4N93R]

Sí eso ví. Otra cosa.

Ví que tienes mucho en español y otras cosas en inglés, trata de usar un solo idioma, si es inglés mejor.

En los nombres de los métodos no uses _ a menos de que sea un método handler de un evento.

Y Trata de usar clases para todo, de esa forma es un poco más mantenible.

Un saludo.