Traducir este código de C# a Java

Iniciado por TickTack, 22 Abril 2020, 14:51 PM

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

TickTack

Hola a todos,

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


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:

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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

rub'n

#1
Cita de: 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?


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:

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.



using (MemoryStream ms = new MemoryStream(data))
using (Stream s = new InflaterInputStream(ms))


Gracias y saludos

Ejemplo


using (MemoryStream ms = new MemoryStream(data)) / ByteArrayInputStream/ByteArrayOutPutStream
using (Stream s = new InflaterInputStream(ms))  / GZIPInputStream


Código (java) [Seleccionar]

public static byte[] decompress(final byte[] data)  {
         try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);
              final GZIPInputStream gzip = new GZIPInputStream(bis);
              final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {

              final byte[] buffer = new byte[8192];
              int dataRead = 0;

              while((dataRead = gzip.read(buffer)) != -1) {
                 baos.write(buffer,0,dataRead);
              }

              return baos.toByteArray();
          } catch(IOException ex) {
               throw new RuntimeException();
          }
}


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

Código (java) [Seleccionar]

public static byte[] descompres(final byte[] data)  {
try(final var bis = new ByteArrayInputStream(data);
     final var gzip = new GZIPInputStream(bis);
     final var baos = new ByteArrayOutputStream()) {

gzip.transferTo(baos);
return baos.toByteArray();

} catch(IOException ex) {
//Mejorar excepcion
throw new RuntimeException();
}
}



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

TickTack

#2
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 :( :


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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

rub'n

Cita de: 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 :( :


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.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

TickTack

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):

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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

rub'n

Cita de: 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):

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 (csharp) [Seleccionar]
class DecryptedHashlink
   {
       public String Name { get; set; }
       public IPAddress IP { get; set; }
       public ushort Port { get; set; }
   }



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

TickTack

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:


try(final ByteArrayInputStream bis = new ByteArrayInputStream(data);

El error es: Missing ')'.

Cómo podría solucionarlo?


Muchísimas gracias por tu ayuda y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

rub'n

#7
Cita de: 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:


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.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

@XSStringManolo

Cita de: 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:


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.

TickTack

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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."