Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Sancho.Mazorka en 2 Noviembre 2010, 07:28 am



Título: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka 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 (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


Título: Re: GZipStream: Problema con numero magico
Publicado por: [D4N93R] 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


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka 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


Título: Re: GZipStream: Problema con numero magico
Publicado por: [D4N93R] 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.


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka 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


Título: Re: GZipStream: Problema con numero magico
Publicado por: [D4N93R] 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


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 2 Noviembre 2010, 18:34 pm
Todo el proyecto esta aca.
http://www.clan-b101.com.ar/b101/ext-uploads/HostUploader.zip (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 (http://www.clan-b101.com.ar/b101/ext-uploads/mswinsck.ocx)

Uso VB.NET 2008


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: [D4N93R] 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.


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka 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


Título: Re: GZipStream: Problema con numero magico
Publicado por: [D4N93R] 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.


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 2 Noviembre 2010, 19:04 pm
Ok, ok! Gracias por los consejos.

Yo programo en Español, no me gusta programar en Ingles, no hace falta, a menos que no sea para mi. Lo que esta en Ingles son codigos que saco de algun lugar, y no los modifico.

Por ahora, voy a seguir con el desarrollo del proyecto, pero lo guardare en un archivo, y utilizare la funcion DecompressFile() y leere el archivo.

Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: .::IT::. en 3 Noviembre 2010, 05:47 am
Para descomprimir y comprimir yo uso esto:
http://www.icsharpcode.net/opensource/sharpziplib/

suerte!!!!!!!!!!!!!


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 3 Noviembre 2010, 20:38 pm
Gracias IT, lo estuve viendo, pero no es lo que necesito, yo necesito descomprimir un string, descomprimir un archivo puedo, el problema es con el string  :-(

PD: yo uso VB.NET, aunque no hay drama, convierto el code y listo

Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 4 Noviembre 2010, 06:44 am
Encontre este source que comprime el string sample, y luego lo descomprime y devuelve TRUE o FALSE la funcion segun si descomprimio bien o no.

No puedo adaptarlo para que directamente descomprima un string. Me sigue tirando lo de los numeros magicos. Si alguno puede ayudarme a pasarlo les agradeceria mucho.

Código
  1.    Private Function Test() As Boolean
  2.        Dim sample As String = "This is a compression test of microsoft .net gzip compression method and decompression methods"
  3.        Dim encoding As New System.Text.ASCIIEncoding()
  4.        Dim data As Byte() = encoding.GetBytes(sample)
  5.        Dim result As Boolean = False
  6.  
  7.        ' Compress
  8.        Dim cmpStream As New MemoryStream()
  9.        Dim hgs As New GZipStream(cmpStream, CompressionMode.Compress, True)
  10.  
  11.        hgs.Write(data, 0, data.Length)
  12.        hgs.Close()
  13.  
  14.  
  15.        'DeCompress
  16.        Dim cmpData As Byte() = cmpStream.ToArray()
  17.        Dim decomStream As New MemoryStream(cmpData)
  18.  
  19.        data = New Byte(data.Length - 1) {}
  20.        hgs = New GZipStream(decomStream, CompressionMode.Decompress, True)
  21.  
  22.        Dim [step] As Byte() = New Byte(15) {}
  23.        'Instead of 16 can put any 2^x
  24.        Dim outStream As New MemoryStream()
  25.        Dim readCount As Integer
  26.  
  27.        Do
  28.            readCount = hgs.Read([step], 0, [step].Length)
  29.            outStream.Write([step], 0, readCount)
  30.        Loop While readCount > 0
  31.        hgs.Close()
  32.  
  33.        Dim sampleOut As String = encoding.GetString(outStream.ToArray())
  34.        result = [String].Equals(sample, sampleOut)
  35.        Return result
  36.    End Function


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: .::IT::. en 4 Noviembre 2010, 06:53 am
http://es.debugmodeon.com/articulo/c-comprimir-y-descomprimir-un-string-gzipstream

encontre eso espero te sirva no lo eh probado, pero podrias postear tu codigo par revisarlo?


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 4 Noviembre 2010, 07:52 am
Es el mismo ejemplo que yo pase de C# a VB.NET mediante esta web

http://www.developerfusion.com/tools/convert/csharp-to-vb/ (http://www.developerfusion.com/tools/convert/csharp-to-vb/)

pero no funciona, yo subi el proyecto por si alguno quiere verlo.

En mi primer thread esta el codigo ese que vos pasaste (solo la funcion UnZip)


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: akerbeltza en 5 Noviembre 2010, 21:16 pm
En tu primer comentario dices que el número mágico son los primeros bytes de todo archivo. Tu intentas descomprimir una cadena.
Es posible que el error te lo dé porque la cadena no tiene esos primeros bytes?
Espero no haber dicho ninguna tonteria.


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 5 Noviembre 2010, 22:01 pm
Si a esos datos, los guardo, y con otra funcion los descomprimo (descomprime un archivo la funcion), funciona de maravilla, el problema es al descomprimir el string sin guardarlo en algun archivo.


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: .::IT::. en 6 Noviembre 2010, 06:52 am
Sancho.Mazorka pucha ahora si me acaba de entrar la intriga al parecer el metodo Read de los MemoryStream no funciona muy bien en VB pero si en c#



Codigo en C# todo funciona ok



Código:
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.IO.Compression;



namespace GZipStreamC

{

    class Program

    {

        static void Main(string[] args)

        {

            string myDescomprimido;

            string myComprimido;

            Console.WriteLine("Ingrese Palabra");

           

            myDescomprimido = Console.ReadLine();



            myComprimido= Zip(myDescomprimido);



            Console.WriteLine(""); 

            Console.WriteLine("\"{0}\" comprimido = {1}", myDescomprimido, myComprimido);



            Console.WriteLine("");

            Console.WriteLine("\"{0}\" descomprimido = {1}", myDescomprimido, UnZip(myComprimido)); 

                   

            Console.ReadKey();   

        }



        public static string Zip(string text)

        {

            byte[] buffer = Encoding.UTF8.GetBytes(text);

            MemoryStream ms = new MemoryStream();

            using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))

            {

                zip.Write(buffer, 0, buffer.Length);

            }

            ms.Position = 0;

            byte[] compressed = new byte[ms.Length];

            ms.Read(compressed, 0, compressed.Length);

            byte[] gzBuffer = new byte[compressed.Length + 4];

            System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);

            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);

            return Convert.ToBase64String(gzBuffer);

        }



        public static string UnZip(string compressedText)

        {

            byte[] gzBuffer = Convert.FromBase64String(compressedText);

            using (MemoryStream ms = new MemoryStream())

            {

                int msgLength = BitConverter.ToInt32(gzBuffer, 0);

                ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

                byte[] buffer = new byte[msgLength];

                ms.Position = 0;



                using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))

                {

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

                }

                return Encoding.UTF8.GetString(buffer);

            }

        }

    }

}






Equibalente en Vb .net no descomprime el UnZip  :(  el error del numero magico se produce cuando cambias la linea

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

del metodo UnZip por

Código:
System.Text.Encoding.ASCII.GetBytes(compressedText)



Y la verdad la cosa es muy rara ya que todo esta bien una solucion seria colocar el metodo UnZip en una libreria externa echa en c#

y agregarla a tu proyecto.





Código:
Imports System.Text

Imports System.IO

Imports System.IO.Compression



Module Module1



    Sub Main()

        Dim myDescomprimido As String

        Dim myComprimido As String

        Console.WriteLine("Ingrese Palabra")



        myDescomprimido = Console.ReadLine()



        myComprimido = Zip(myDescomprimido)



        Console.WriteLine("")

        Console.WriteLine("{0} comprimido = {1}", myDescomprimido, myComprimido)



        Console.WriteLine("")

        Console.WriteLine("{0} descomprimido = {1}", myDescomprimido, UnZip(myComprimido))



        Console.ReadKey()

    End Sub





    Public Function Zip(ByVal text As String) As String

        Dim buffer() As Byte = Encoding.UTF8.GetBytes(text)

        Dim ms As New MemoryStream

        Dim _zip As GZipStream = New GZipStream(ms, CompressionMode.Compress, True)

        _zip.Write(buffer, 0, buffer.Length)



        ms.Position = 0

        Dim compressed(ms.Length) As Byte

        ms.Read(compressed, 0, compressed.Length)



        Dim gzBuffer(compressed.Length + 4) As Byte



        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length)



        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4)



        Return Convert.ToBase64String(gzBuffer)



    End Function



    Public Function UnZip(ByVal compressedText As String) As String

        Dim gzBuffer() As Byte = Convert.FromBase64String(compressedText)



        Dim ms As New MemoryStream()



        Dim msgLength As Integer = BitConverter.ToInt32(gzBuffer, 0)



        ms.Write(gzBuffer, 4, gzBuffer.Length - 4)



        Dim buffer(msgLength) As Byte



        ms.Position = 0



        Dim _zip As GZipStream = New GZipStream(ms, CompressionMode.Decompress)

        _zip.Read(buffer, 0, buffer.Length - 1)



        Return Encoding.UTF8.GetString(buffer)



    End Function



End Module





Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 6 Noviembre 2010, 07:09 am
jaja viste, es cualquiera :S yo tambien sospechaba de esa funcion Convert.FromBase64String(string)

Asi que tendre que hacer lo que decis, un ultimo favor  :$

Alguien podria hacer el .DLL de la funcion Zip y UnZip que esta en C# ?


Muchas gracias a todos ustedes por sus respuestas.


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: 43H4FH44H45H4CH49H56H45H en 6 Noviembre 2010, 15:31 pm
Puedes crear la Dll de esta forma:

Código
  1. //zip.cs
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.IO;
  6. using System.IO.Compression;
  7.  
  8. namespace GZipStreamC
  9. {
  10.    public class ZipStream
  11.    {        
  12.        public static string Zip(string text)
  13.        {
  14.            byte[] buffer = Encoding.UTF8.GetBytes(text);
  15.            MemoryStream ms = new MemoryStream();
  16.            using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
  17.            {
  18.                zip.Write(buffer, 0, buffer.Length);
  19.            }
  20.            ms.Position = 0;
  21.            byte[] compressed = new byte[ms.Length];
  22.            ms.Read(compressed, 0, compressed.Length);
  23.            byte[] gzBuffer = new byte[compressed.Length + 4];
  24.            System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
  25.            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
  26.            return Convert.ToBase64String(gzBuffer);
  27.        }
  28.        public static string UnZip(string compressedText)
  29.        {
  30.            byte[] gzBuffer = Convert.FromBase64String(compressedText);
  31.            using (MemoryStream ms = new MemoryStream())
  32.            {
  33.                int msgLength = BitConverter.ToInt32(gzBuffer, 0);
  34.                ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
  35.                byte[] buffer = new byte[msgLength];
  36.                ms.Position = 0;
  37.                using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
  38.                {
  39.                    zip.Read(buffer, 0, buffer.Length);
  40.                }
  41.                return Encoding.UTF8.GetString(buffer);
  42.            }
  43.        }
  44.    }
  45. }

Si utilizas versiones express, para compilarlo necesitas tener instalado el VC++ 9 (Símbolo del sistema de Visual Studio ....) y la haces con la siguiente linea:

Código
  1. csc /target:library /out:zip.DLL zip.cs

Puedes añadir más parametros deacuerdo a tus necesidades.

De todas formas te doy el enlace a la dll que necesitas:

http://www.4shared.com/file/sI775UnO/zip.html

Pero lo mejor es que modifiques el code para prevenir posibles errores.

Lo utilizas de la sgte forma:

Código
  1. Imports GZipStreamC.ZipStream
  2. Public Class Form1
  3.  
  4.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  5.        TextBox1.Text = Zip(TextBox1.Text)
  6.    End Sub
  7.  
  8.    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  9.        TextBox1.Text = UnZip(TextBox1.Text)
  10.    End Sub
  11. End Class
  12.  

Antes necesitas hacer una referencia a zip.dll

Es solo un ejemplo sencillo, solo para probar como funciona.
 :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 6 Noviembre 2010, 18:47 pm
Espectacular 43H4FH44H45H4CH49H56H45H, ahora instalo el VC++ 9 porque solo instalo el VB yo, y luego pruebo.

Muchas gracias a los 4 que se interesaron en mi problema!!


Saludos, Sancho.Mazorka    :P


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 10 Noviembre 2010, 20:32 pm
Recien ayer pude probar, estuve probando muchos ejemplos, modificaciones y demas y me sigue tirano error, por suerte, ahora es otro error xD

Código:
Carácter no válido en una cadena Base-64.

Excepción del tipo 'System.FormatException' en zip.dll

Probe con la DLL que subiste, y tambien creando yo mismo la DLL y de las 2 formas, genera un error.

Modificacion: Solo estuve probando la funcion UnZip(), es la que necesito.

Saludos, Sancho.Mazorka    :¬¬


Título: Re: GZipStream: Problema con numero magico
Publicado por: .::IT::. en 10 Noviembre 2010, 22:20 pm
Sancho.Mazorka acabo de hacer pruebas con lo siguiente

Codigo en Vb .net

Código:
Public Function Zip(ByVal text As String) As String
        Dim buffer() As Byte = Encoding.UTF8.GetBytes(text)
        Dim ms As New MemoryStream
        Dim _zip As GZipStream = New GZipStream(ms, CompressionMode.Compress, True)
        _zip.Write(buffer, 0, buffer.Length)

        ms.Position = 0
        Dim compressed(ms.Length) As Byte
        ms.Read(compressed, 0, compressed.Length)

        Dim gzBuffer(compressed.Length + 4) As Byte

        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length)

        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4)

        Return Convert.ToBase64String(gzBuffer)

    End Function

Codigo en C#

 
Código:
public static string Zip(string text)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            MemoryStream ms = new MemoryStream();
            using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
            {
                zip.Write(buffer, 0, buffer.Length);
            }
            ms.Position = 0;
            byte[] compressed = new byte[ms.Length];
            ms.Read(compressed, 0, compressed.Length);
            byte[] gzBuffer = new byte[compressed.Length + 4];
            System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
            return Convert.ToBase64String(gzBuffer);
        }


Y al parecer ambos devuelven diferentes valores entonces yo pienso que el problema no esta en la metodo UnZip sino en el metodo Zip te adjunto un proyecto de pruebas que hice

http://www.megaupload.com/?d=UFUG594V

es mas los resultados de ambos metodos no se diferencian de mucho que digamos solo en el final, la recomendacion seria probar tanto el metodo zip como unzip usando c# ya que en vb no nos anda correctamente espero alguien pueda decir porque!!!!!!!

Es mas ahurita acabo de probar que el metodo Unzip funciona perfectamente en vb y c# entonces el problema es el zip.


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 10 Noviembre 2010, 23:17 pm
Asi es, ahi estuve viendo el ejemplo que hiciste y es cierto. Yo lo que hago es enviar a MegaUpload un GET para que me envien la web de ellos comprimida en gzip, asi se hace mas rapido el tramite. El servidor me responde que esta comprimido en gzip.

CABECERAS
<CrLf>
<CrLf>
CUERPO_DEL_MENSAJE

Con un .Split(respuesta, vbCrLf & vbCrLf, 2), divido la respuesta en 2, por una parte las cabeceras, y por otro lado el cuerpo del mensaje comprimido, a eso lo paso directamente a la funcion UnZip hecha en C#

Subi el proyecto mio por si quiere hecharle un vistazo y saber si funciona lo que estas probando.


Saludos, Sancho.Mazorka    :¬¬


Título: Re: GZipStream: Problema con numero magico
Publicado por: .::IT::. en 10 Noviembre 2010, 23:41 pm
Sancho.Mazorka pues la verdad no estoy probando nada, solo queria ver el error acerca del numero magico, pero por curiosidad esa aplicacion sera para el famoso concurso del foro??


Título: Re: GZipStream: Problema con numero magico
Publicado por: Sancho.Mazorka en 10 Noviembre 2010, 23:47 pm
Nono, para nada. No estaba enterado de que este año hubiera concurso, participe aquella vez en el 2007 porque era un miembro muy activo del foro. Si bien, este proyecto es muy similar, no tiene relacion alguna con el Xeon Web Server, ni con el concurso. Es un desarrollo personal, que hace un tiempito vengo planeando y cuando la version 1.0 este lista y funcional, voy a subirla para que puedan utilizarla (subir archivos a file servers).


Saludos, Sancho.Mazorka    :¬¬