Autor
|
Tema: GZipStream: Problema con numero magico (Leído 22,266 veces)
|
Sancho.Mazorka
Desconectado
Mensajes: 480
Gamer & Programador
|
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.
|
|
|
En línea
|
|
|
|
|
Sancho.Mazorka
Desconectado
Mensajes: 480
Gamer & Programador
|
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
|
|
|
En línea
|
|
|
|
Sancho.Mazorka
Desconectado
Mensajes: 480
Gamer & Programador
|
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. Private Function Test() As Boolean Dim sample As String = "This is a compression test of microsoft .net gzip compression method and decompression methods" Dim encoding As New System.Text.ASCIIEncoding() Dim data As Byte() = encoding.GetBytes(sample) Dim result As Boolean = False ' Compress Dim cmpStream As New MemoryStream() Dim hgs As New GZipStream(cmpStream, CompressionMode.Compress, True) hgs.Write(data, 0, data.Length) hgs.Close() 'DeCompress Dim cmpData As Byte() = cmpStream.ToArray() Dim decomStream As New MemoryStream(cmpData) data = New Byte(data.Length - 1) {} hgs = New GZipStream(decomStream, CompressionMode.Decompress, True) Dim [step] As Byte() = New Byte(15) {} 'Instead of 16 can put any 2^x Dim outStream As New MemoryStream() Dim readCount As Integer Do readCount = hgs.Read([step], 0, [step].Length) outStream.Write([step], 0, readCount) Loop While readCount > 0 hgs.Close() Dim sampleOut As String = encoding.GetString(outStream.ToArray()) result = [String].Equals(sample, sampleOut) Return result End Function
|
|
|
En línea
|
|
|
|
|
Sancho.Mazorka
Desconectado
Mensajes: 480
Gamer & Programador
|
Es el mismo ejemplo que yo pase de C# a VB.NET mediante esta web 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)
|
|
« Última modificación: 4 Noviembre 2010, 08:03 am por Sancho.Mazorka »
|
En línea
|
|
|
|
akerbeltza
Desconectado
Mensajes: 1
|
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.
|
|
|
En línea
|
|
|
|
|
.::IT::.
Desconectado
Mensajes: 167
|
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 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 Dim gzBuffer() As Byte = Convert.FromBase64String(compressedText) del metodo UnZip por 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. 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
|
|
|
En línea
|
Simplemente .::IT::.
|
|
|
Sancho.Mazorka
Desconectado
Mensajes: 480
Gamer & Programador
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con cuadrado mágico [RESUELTO]
Programación C/C++
|
bigfu
|
7
|
13,189
|
14 Enero 2016, 02:11 am
por Dayciber
|
|
|
Cuadrado Mágico
Programación C/C++
|
Black Lotus
|
5
|
5,148
|
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
|
2,233
|
19 Noviembre 2013, 21:00 pm
por Eleкtro
|
|
|
Cuadrado Mágico
Programación C/C++
|
anaaaaaaa
|
3
|
7,365
|
7 Diciembre 2015, 16:37 pm
por ivancea96
|
|
|
cuadrado magico
Dudas Generales
|
manno
|
1
|
2,140
|
5 Julio 2020, 02:15 am
por tincopasan
|
|