Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TickTack en 22 Abril 2020, 14:51 pm



Título: Traducir este código de C# a Java
Publicado por: TickTack en 22 Abril 2020, 14:51 pm
Hola a todos,

¿alguien me puede ayudar, por favor, a traducir este pequeño código de C# a Java?

Código:
public static byte[] Decompress(byte[] data)
        {
            try
            {
                byte[] r = null;

                using (MemoryStream ms = new MemoryStream(data))
                using (Stream s = new InflaterInputStream(ms))
                {
                    List<byte> list = new List<byte>();
                    int count = 0;
                    byte[] b = new byte[8192];

                    while ((count = s.Read(b, 0, 8192)) > 0)
                        list.AddRange(b.Take(count));

                    r = list.ToArray();
                    list.Clear();
                    list = null;
                }

                return r;
            }
            catch { }

            return new byte[] { };
        }
En especial, no se cómo programar estás dos líneas con Java:
Código:
using (MemoryStream ms = new MemoryStream(data))
using (Stream s = new InflaterInputStream(ms))
Ya que en Java reemplazo el using por el try. Pero no funciona si lo hago dos veces en este caso.


Gracias y saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 22 Abril 2020, 16:00 pm
Hola a todos,

¿alguien me puede ayudar, por favor, a traducir este pequeño código de C# a Java?

Código:
public static byte[] Decompress(byte[] data)
        {
            try
            {
                byte[] r = null;

                using (MemoryStream ms = new MemoryStream(data))
                using (Stream s = new InflaterInputStream(ms))
                {
                    List<byte> list = new List<byte>();
                    int count = 0;
                    byte[] b = new byte[8192];

                    while ((count = s.Read(b, 0, 8192)) > 0)
                        list.AddRange(b.Take(count));

                    r = list.ToArray();
                    list.Clear();
                    list = null;
                }

                return r;
            }
            catch { }

            return new byte[] { };
        }
En especial, no se cómo programar estás dos líneas con Java:
Código:
using (MemoryStream ms = new MemoryStream(data))
using (Stream s = new InflaterInputStream(ms))
Ya que en Java reemplazo el using por el try. Pero no funciona si lo hago dos veces en este caso.


Código:
using (MemoryStream ms = new MemoryStream(data))
using (Stream s = new InflaterInputStream(ms))

Gracias y saludos

Ejemplo

Código:
using (MemoryStream ms = new MemoryStream(data)) / ByteArrayInputStream/ByteArrayOutPutStream
using (Stream s = new InflaterInputStream(ms))  / GZIPInputStream

Código
  1. public static byte[] decompress(final byte[] data)  {
  2.          try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);
  3.               final GZIPInputStream gzip = new GZIPInputStream(bis);
  4.               final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
  5.  
  6.               final byte[] buffer = new byte[8192];
  7.               int dataRead = 0;
  8.  
  9.               while((dataRead = gzip.read(buffer)) != -1) {
  10.                  baos.write(buffer,0,dataRead);
  11.               }
  12.  
  13.               return baos.toByteArray();
  14.           } catch(IOException ex) {
  15.                throw new RuntimeException();
  16.           }
  17. }

Con versiones superiores a la jdk 8, aqui use open jdk 11

Código
  1. public static byte[] descompres(final byte[] data)  {
  2. try(final var bis = new ByteArrayInputStream(data);
  3.      final var gzip = new GZIPInputStream(bis);
  4.      final var baos = new ByteArrayOutputStream()) {
  5.  
  6. gzip.transferTo(baos);
  7. return baos.toByteArray();
  8.  
  9. } catch(IOException ex) {
  10. //Mejorar excepcion
  11. throw new RuntimeException();
  12. }
  13. }


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 22 Abril 2020, 19:02 pm
Hola rub'n,

¡¡wow!!

El único detalle que se me olvidó comentar fue que la clase InflaterInputStream que mostré en el pequeño código se refiere a esta clase: https://github.com/icsharpcode/SharpZipLib/blob/master/src/ICSharpCode.SharpZipLib/Zip/Compression/Streams/InflaterInputStream.cs

Como no necesito todo el contenido, no quería traducir todo. Pero solamente pude traducir cómo pasar parámetros de un constructor a otro. Nada más :( :

Código:
public class InflaterInputStream {
public InflaterInputStream(Stream baseInputStream)
{
this(baseInputStream, new Inflater(), 4096);
}

/// <summary>
/// Create an InflaterInputStream with the specified decompressor
/// and a default buffer size of 4KB.
/// </summary>
/// <param name = "baseInputStream">
/// The source of input data
/// </param>
/// <param name = "inf">
/// The decompressor used to decompress data read from baseInputStream
/// </param>


/// <summary>
/// Create an InflaterInputStream with the specified decompressor
/// and the specified buffer size.
/// </summary>
/// <param name = "baseInputStream">
/// The InputStream to read bytes from
/// </param>
/// <param name = "inflater">
/// The decompressor to use
/// </param>
/// <param name = "bufferSize">
/// Size of the buffer to use
/// </param>
public InflaterInputStream(Stream baseInputStream, Inflater inflater, int bufferSize)
{
if (baseInputStream == null)
{
throw new ArgumentNullException(nameof(baseInputStream));
}

if (inflater == null)
{
throw new ArgumentNullException(nameof(inflater));
}

if (bufferSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(bufferSize));
}

this.baseInputStream = baseInputStream;
this.inf = inflater;

inputBuffer = new InflaterInputBuffer(baseInputStream, bufferSize);
}
}

En especial no se cómo crear un objeto de Stream como en el código.

Se tendría que modificar el código que tú compartiste si se tiene en cuenta que InflaterInputStream no es lo que quizás tú pensaste que era?

Aunque quizás no se tenga que cambiar tu código --> https://icsharpcode.github.io/SharpZipLib/help/api/ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream.html
En ese link sale el autor original de Java...


Muchísimas gracias y muchos saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 22 Abril 2020, 20:22 pm
Hola rub'n,

¡¡wow!!

El único detalle que se me olvidó comentar fue que la clase InflaterInputStream que mostré en el pequeño código se refiere a esta clase: https://github.com/icsharpcode/SharpZipLib/blob/master/src/ICSharpCode.SharpZipLib/Zip/Compression/Streams/InflaterInputStream.cs

Como no necesito todo el contenido, no quería traducir todo. Pero solamente pude traducir cómo pasar parámetros de un constructor a otro. Nada más :( :

Código:
public class InflaterInputStream {
public InflaterInputStream(Stream baseInputStream)
{
this(baseInputStream, new Inflater(), 4096);
}

/// <summary>
/// Create an InflaterInputStream with the specified decompressor
/// and a default buffer size of 4KB.
/// </summary>
/// <param name = "baseInputStream">
/// The source of input data
/// </param>
/// <param name = "inf">
/// The decompressor used to decompress data read from baseInputStream
/// </param>


/// <summary>
/// Create an InflaterInputStream with the specified decompressor
/// and the specified buffer size.
/// </summary>
/// <param name = "baseInputStream">
/// The InputStream to read bytes from
/// </param>
/// <param name = "inflater">
/// The decompressor to use
/// </param>
/// <param name = "bufferSize">
/// Size of the buffer to use
/// </param>
public InflaterInputStream(Stream baseInputStream, Inflater inflater, int bufferSize)
{
if (baseInputStream == null)
{
throw new ArgumentNullException(nameof(baseInputStream));
}

if (inflater == null)
{
throw new ArgumentNullException(nameof(inflater));
}

if (bufferSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(bufferSize));
}

this.baseInputStream = baseInputStream;
this.inf = inflater;

inputBuffer = new InflaterInputBuffer(baseInputStream, bufferSize);
}
}

En especial no se cómo crear un objeto de Stream como en el código.

Se tendría que modificar el código que tú compartiste si se tiene en cuenta que InflaterInputStream no es lo que quizás tú pensaste que era?

Aunque quizás no se tenga que cambiar tu código --> https://icsharpcode.github.io/SharpZipLib/help/api/ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream.html
En ese link sale el autor original de Java...


Muchísimas gracias y muchos saludos

:huh: que es lo que quieres hacer? descomprimir un archivo, analiza bien cual es tu meta con esto LMAO.


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 22 Abril 2020, 21:36 pm
Hola rub'n,

muchas gracias por preguntar. Lo que en realidad quiero hacer es descifrar Hashlinks con Java (traduciendo un código de C# con el cual ya se puede hacer eso).

Y en este link empieza la historia: https://github.com/AresChat/cb0t/blob/37b45f81a1b61355423475f1f9cb519de74e7b52/cb0t/Misc/Hashlink.cs

Empieza, en especial en este código (en el comentario te muestro hasta donde traduci):
Código:
public static DecryptedHashlink DecodeHashlink(String hashlink)
        {
            DecryptedHashlink room = new DecryptedHashlink();

            try
            {
                if (hashlink.ToUpper().StartsWith("CHATROOM:")) // not encrypted
                {
                    hashlink = hashlink.Substring(9);
                    int split = hashlink.IndexOf(":");
                    room.IP = IPAddress.Parse(hashlink.Substring(0, split));
                    hashlink = hashlink.Substring(split + 1);
                    split = hashlink.IndexOf("|");
                    room.Port = ushort.Parse(hashlink.Substring(0, split));
                    room.Name = hashlink.Substring(split + 1);
                    return room;
                }
                else // encrypted
                {
                    byte[] buf = Convert.FromBase64String(hashlink);
                    buf = d67(buf, 28435); //hasta ahí pude traducir sin problemas
                    buf = Zip.Decompress(buf);

                    HashlinkReader reader = new HashlinkReader(buf);
                    reader.SkipBytes(32);
                    room.IP = reader;
                    room.Port = reader;
                    reader.SkipBytes(4);
                    room.Name = reader;

                    return room;
                }
            }
            catch // badly formed hashlink
            {
                return null;
            }
        }

Y ahí está el método Zip.Decompress(): https://github.com/AresChat/cb0t/blob/37b45f81a1b61355423475f1f9cb519de74e7b52/cb0t/Misc/Zip.cs

El método Zip.Decompress() es el del que trata este post.


Muchísimas gracias y muchos saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 22 Abril 2020, 21:47 pm
Hola rub'n,

muchas gracias por preguntar. Lo que en realidad quiero hacer es descifrar Hashlinks con Java (traduciendo un código de C# con el cual ya se puede hacer eso).

Y en este link empieza la historia: https://github.com/AresChat/cb0t/blob/37b45f81a1b61355423475f1f9cb519de74e7b52/cb0t/Misc/Hashlink.cs

Empieza, en especial en este código (en el comentario te muestro hasta donde traduci):
Código:
public static DecryptedHashlink DecodeHashlink(String hashlink)
        {
            DecryptedHashlink room = new DecryptedHashlink();

            try
            {
                if (hashlink.ToUpper().StartsWith("CHATROOM:")) // not encrypted
                {
                    hashlink = hashlink.Substring(9);
                    int split = hashlink.IndexOf(":");
                    room.IP = IPAddress.Parse(hashlink.Substring(0, split));
                    hashlink = hashlink.Substring(split + 1);
                    split = hashlink.IndexOf("|");
                    room.Port = ushort.Parse(hashlink.Substring(0, split));
                    room.Name = hashlink.Substring(split + 1);
                    return room;
                }
                else // encrypted
                {
                    byte[] buf = Convert.FromBase64String(hashlink);
                    buf = d67(buf, 28435); //hasta ahí pude traducir sin problemas
                    buf = Zip.Decompress(buf);

                    HashlinkReader reader = new HashlinkReader(buf);
                    reader.SkipBytes(32);
                    room.IP = reader;
                    room.Port = reader;
                    reader.SkipBytes(4);
                    room.Name = reader;

                    return room;
                }
            }
            catch // badly formed hashlink
            {
                return null;
            }
        }

Y ahí está el método Zip.Decompress(): https://github.com/AresChat/cb0t/blob/37b45f81a1b61355423475f1f9cb519de74e7b52/cb0t/Misc/Zip.cs

El método Zip.Decompress() es el del que trata este post.


Muchísimas gracias y muchos saludos

Pasa esta clase a Java LMAO

https://github.com/AresChat/cb0t/blob/37b45f81a1b61355423475f1f9cb519de74e7b52/cb0t/Misc/HashlinkReader.cs

Ya esta DecryptedHashlink es muy simple.

Código
  1. class DecryptedHashlink
  2.    {
  3.        public String Name { get; set; }
  4.        public IPAddress IP { get; set; }
  5.        public ushort Port { get; set; }
  6.    }


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 22 Abril 2020, 22:19 pm
Hola rub'n,

y qué hay del método Zip.Decompress? Lo dejo como tú me lo compartiste? En caso de ser así ya me larga error en esta línea:

Código:
try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);
El error es: Missing ')'.

Cómo podría solucionarlo?


Muchísimas gracias por tu ayuda y saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 22 Abril 2020, 22:58 pm
Hola rub'n,

y qué hay del método Zip.Decompress? Lo dejo como tú me lo compartiste? En caso de ser así ya me larga error en esta línea:

Código:
try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);
El error es: Missing ')'.

Cómo podría solucionarlo?


Muchísimas gracias por tu ayuda y saludos

Que estarás haciendo? esta con código C# aún o que? yo probé eso antes de ir por ahí pegando y copiando, extraño que pase eso.

Escribe tal cual lo que te puse, es try-with resources, y te indica tal cual que te falta un parentesis.

try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);  el código no termina ahí, falta mas, prueba como te lo puse.

Tip, ten paciencia.


Título: Re: Traducir este código de C# a Java
Publicado por: @XSStringManolo en 22 Abril 2020, 23:24 pm
Hola rub'n,

y qué hay del método Zip.Decompress? Lo dejo como tú me lo compartiste? En caso de ser así ya me larga error en esta línea:

Código:
try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);
El error es: Missing ')'.

Cómo podría solucionarlo?


Muchísimas gracias por tu ayuda y saludos
Cambiaste el { por un (. Asique te tira el error, falta un paréntesis. Supongo que si le pones el paréntesis que falta te dira que try está undefined xD.
Mejor copia y pega, en vez de copiar a mano.


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 5 Junio 2020, 21:44 pm
Hola rub'n y @XSStringManolo,

muchísimas gracias por su ayuda. Yo solamente lo copie y lo pegue pero me larga error :(

Puede ser que tenga que ver con el IDE? Yo estoy usando AIDE. Quizás si ustedes lo prueban ahi puedan ver que también les larga errores...


Muchísimas gracias y saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 5 Junio 2020, 21:53 pm
Hola rub'n y @XSStringManolo,

muchísimas gracias por su ayuda. Yo solamente lo copie y lo pegue pero me larga error :(

Puede ser que tenga que ver con el IDE? Yo estoy usando AIDE. Quizás si ustedes lo prueban ahi puedan ver que también les larga errores...


Muchísimas gracias y saludos

Bien hommie, pero como tienes el codigo actual, log de error etc.


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 7 Junio 2020, 00:06 am
Hola rub'n,

el problema es que AIDE no soporta JDK 8. Solo tiene hasta JDK 7.

Es por eso que en tu caso el código que tradujiste te funciona bien.

¿Se podría traducirlo para JDK 7?


Gracias y saludos


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 7 Junio 2020, 02:37 am
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

el codigo que te puse mas arriba en mi primera respuesta, deberia funcionarte con la jdk 7 tranquilamente.

Ahora como tendras tu el codigo? si te faltaba un parentesis y ni avisaste si resolviste eso precisamente.  :xD


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 21 Julio 2020, 00:59 am
Perdón que recién ahora te escribo pero te cuento:

Este código me funcionó:

Código:
public static byte[] Decompress(byte[] data) throws IOException
{
try (InputStream ms = new ByteArrayInputStream(data);
InflaterInputStream s = new InflaterInputStream(ms);
ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
byte[] buf = new byte[8192];
for (int r = s.read(buf); r != -1; r = s.read(buf))
baos.write(buf, 0, r);
return baos.toByteArray();
}
}

El otro no funciona a pesar de haber revisado muchas veces si faltaba un paréntesis u otro signo....


Título: Re: Traducir este código de C# a Java
Publicado por: rub'n en 21 Julio 2020, 11:37 am
Perdón que recién ahora te escribo pero te cuento:

Este código me funcionó:

Código:
public static byte[] Decompress(byte[] data) throws IOException
{
try (InputStream ms = new ByteArrayInputStream(data);
InflaterInputStream s = new InflaterInputStream(ms);
ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
byte[] buf = new byte[8192];
for (int r = s.read(buf); r != -1; r = s.read(buf))
baos.write(buf, 0, r);
return baos.toByteArray();
}
}

El otro no funciona a pesar de haber revisado muchas veces si faltaba un paréntesis u otro signo....

Pues algo estabas haciendo mal XD,

Aquí la diferencia es la clase InflaterInputStream, que es súper clase de GZIPInputStream, XD


Título: Re: Traducir este código de C# a Java
Publicado por: TickTack en 27 Julio 2020, 00:15 am
Me rasque la cabeza y me salió caspa.

Jajajaja

Ni idea que es lo que habré hecho mal. Pero bueno, te agradezco que me hallas ayudado, eh?