elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  GZipStream: Problema con numero magico
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: GZipStream: Problema con numero magico  (Leído 20,589 veces)
Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
GZipStream: Problema con numero magico
« en: 2 Noviembre 2010, 07:28 am »

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
  1. zip.Read(buffer, 0, buffer.Length)

y me genera este error

Código:
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
  1.    Private Function UnZip(ByVal compressedText As String) As String
  2.        Dim gzBuffer As Byte() = System.Text.Encoding.ASCII.GetBytes(compressedText) 'Convert.FromBase64String(compressedText)
  3.        Using ms As New MemoryStream()
  4.            Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)
  5.            ms.Write(gzBuffer, 4, gzBuffer.Length - 4)
  6.            Dim buffer As Byte() = New Byte(msgLength - 1) {}
  7.            ms.Position = 0
  8.  
  9.            Using zip As New GZipStream(ms, CompressionMode.Decompress)
  10.                    zip.Read(buffer, 0, buffer.Length)
  11.            End Using
  12.  
  13.            Return System.Text.Encoding.UTF8.GetString(buffer)
  14.        End Using
  15.    End Function

FUNCION PARA DESCOMPRIMIR UN ARCHIVO - FUNCIONA BIEN
Código
  1.    Private Function DecompressFile(ByVal CompressedFilename As String, ByVal DecompressedFilename As String) As Boolean
  2.        Try
  3.            Dim [Stream] As FileStream = New FileStream(CompressedFilename, FileMode.Open)
  4.            Dim [GZipStream] As GZipStream = New GZipStream([Stream], CompressionMode.Decompress)
  5.            Dim sr As StreamReader = New StreamReader(CType([GZipStream], IO.Stream))
  6.  
  7.            My.Computer.FileSystem.WriteAllText(DecompressedFilename, sr.ReadToEnd(), False)
  8.            sr.Close() : [Stream].Close()
  9.            If File.Exists(DecompressedFilename) Then Return True
  10.        Catch ex As IOException
  11.            msgbox(ex.Message)
  12.        Catch ex As Exception
  13.            msgbox(ex.Message)
  14.        End Try
  15.        Return False
  16.    End Function

Espero puedan ayudarme, muchas gracias.


Saludos, Sancho.Mazorka    :P


« Última modificación: 2 Noviembre 2010, 07:33 am por Sancho.Mazorka » En línea

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


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #1 en: 2 Noviembre 2010, 13:56 pm »

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

   
Código
  1. Private Function UnZip(ByVal compressedText As String) As String
  2.        Dim gzBuffer As Byte() = System.Text.Encoding.ASCII.GetBytes(compressedText) 'Convert.FromBase64String(compressedText)
  3.        Using ms As New MemoryStream()
  4.            Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)
  5.            ms.Write(gzBuffer, 4, gzBuffer.Length - 4)
  6.            Dim buffer As Byte() = New Byte(msgLength - 1) {}
  7.            ms.Position = 0
  8.  
  9.            Using zip As New GZipStream(ms, CompressionMode.Decompress)
  10.                    zip.Read(buffer, 0, buffer.Length)
  11.            End Using
  12.  
  13.            Return System.Text.Encoding.UTF8.GetString(buffer)
  14.        End Using
  15.    End Function


En línea

Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #2 en: 2 Noviembre 2010, 17:02 pm »

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

Código
  1. Dim gzBuffer As Byte() = System.Text.ASCIIEncoding.GetBytes(compressedText)

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

Código:
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
  1. Dim gzBuffer As Byte() = System.Text.UnicodeEncoding.GetBytes(compressedText)

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

Código:
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
  1. Dim gzBuffer As Byte() = System.Text.UTF32Encoding.GetBytes(compressedText)

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

Código:
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
  1. Dim gzBuffer As Byte() = System.Text.UTF7Encoding.GetBytes(compressedText)

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

Código:
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
  1. 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

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



Código
  1. Dim gzBuffer As Byte() = Convert.FromBase64String(compressedText)

Convert.FromBase64String(compressedText)

Código:
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
« Última modificación: 2 Noviembre 2010, 17:04 pm por Sancho.Mazorka » En línea

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


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #3 en: 2 Noviembre 2010, 17:17 pm »

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.
En línea

Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #4 en: 2 Noviembre 2010, 18:07 pm »

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

Código:
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
En línea

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


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #5 en: 2 Noviembre 2010, 18:16 pm »

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

Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #6 en: 2 Noviembre 2010, 18:34 pm »

Todo el proyecto esta aca.
http://www.clan-b101.com.ar/b101/ext-uploads/HostUploader.zip

El mswinsck.ocx aca, utilice este para probar rapidamente.
http://www.clan-b101.com.ar/b101/ext-uploads/mswinsck.ocx

Uso VB.NET 2008


Saludos, Sancho.Mazorka    :P
En línea

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


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #7 en: 2 Noviembre 2010, 18:51 pm »

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.
En línea

Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #8 en: 2 Noviembre 2010, 18:56 pm »

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
En línea

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


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: GZipStream: Problema con numero magico
« Respuesta #9 en: 2 Noviembre 2010, 19:00 pm »

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.
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con cuadrado mágico [RESUELTO]
Programación C/C++
bigfu 7 12,216 Último mensaje 14 Enero 2016, 02:11 am
por Dayciber
Cuadrado Mágico
Programación C/C++
Black Lotus 5 4,528 Último mensaje 15 Marzo 2013, 20:58 pm
por Black Lotus
Pasar programa de Ciclo if a for (cuadro magico)
.NET (C#, VB.NET, ASP)
ellandax 1 1,975 Último mensaje 19 Noviembre 2013, 21:00 pm
por Eleкtro
Cuadrado Mágico
Programación C/C++
anaaaaaaa 3 6,819 Último mensaje 7 Diciembre 2015, 16:37 pm
por ivancea96
cuadrado magico
Dudas Generales
manno 1 1,760 Último mensaje 5 Julio 2020, 02:15 am
por tincopasan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines