Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
Decodificación de cadenas Base64 en Java

Estoy usando Java y tengo una cadena codificada en Base64 que deseo decodificar y luego hacer algunas operaciones para transformar.

El valor decodificado correcto se obtiene en JavaScript a través de la función atob() , pero en java, usando Base64.decodeBase64() no puedo obtener un valor igual.

Ejemplo:

Para:

 String str = "AAAAAAAAAAAAAAAAAAAAAMaR+ySCU0Yzq+AV9pNCCOI="

Con JavaScript atob(str) obtengo ->

"Æ'û$‚SF3«àö“Bâ"

Con Java new String(Base64.decodeBase64(str)) obtengo ->

"Æ?û$?SF3«à§ö?â"


Otra forma de solucionar el problema es ejecutar JavaScript en Java con un motor Nashorn, pero recibo un error cerca del símbolo "$" .

Código actual:

 ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); String script2 = "function decoMemo(memoStr){ print(atob(memoStr).split('')" + ".map((aChar) => `0${aChar.charCodeAt(0).toString(16)}`" + ".slice(-2)).join('').toUpperCase());}"; try { engine.eval(script2); Invocable inv = (Invocable) engine; String returnValue = (String)inv.invokeFunction("decoMemo", memoTest ); System.out.print("\n result: " + returnValue); } catch (ScriptException | NoSuchMethodException e1) { e1.printStackTrace();

Cualquier ayuda sería apreciada. Busco en muchos lugares pero no puedo encontrar la respuesta correcta.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

btoa está roto y no debe usarse.

El problema es que los bytes no son caracteres. La codificación Base64 solo hace una cosa. Convierte bytes en un flujo de caracteres que sobreviven prácticamente a cualquier mecanismo de transporte basado en texto. Y la decodificación Base64 hace eso a la inversa, convierte dichos caracteres en bytes .

Y la confusión es que estás imprimiendo esos bytes como si fueran caracteres. Ellos no son.

Terminas con exactamente los mismos bytes, pero javascript y java no están de acuerdo sobre cómo se supone que debes convertir eso en una cadena sucedánea porque estás tratando de imprimirlo en una consola. Eso es un error: los bytes no son caracteres. Por lo tanto, se está utilizando algún tipo de codificación de juego de caracteres, y no desea nada de esto, porque estos caracteres claramente no están destinados a imprimirse de esa manera.

El tipo de Javascript equivale a la mitad de caracteres y bytes y convertirá libremente uno a otro, eligiendo una codificación aleatoria. Uf. Javascript apesta en este sentido, es lo que es. Los documentos de MDN en btoa explican por qué no debería usarlo. Te estás encontrando con ese problema.

No estoy del todo seguro de cómo lo arregla en javascript, pero tal vez no lo necesite. Java está decodificando los bytes perfectamente bien, al igual que javascript, pero javascript luego convierte esos bytes en caracteres de una manera tonta y eso está causando el problema.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Lo que tienes allí no es una cadena de texto en absoluto. El obsequio son los AA al principio. Esos se asignan a un número de cero bytes. Eso no se traduce en texto significativo en ningún conjunto de caracteres estándar.

Entonces, lo que tiene allí es probablemente datos binarios. Convertirlo en una cadena no le dará un texto significativo.


Ahora para explicar la diferencia que está viendo entre Java y Javascript. Me parece que tanto Java como Javascript están haciendo un "mejor esfuerzo" para convertir los datos binarios como si estuvieran codificados en ISO-8859-1 (también conocido como ISO LATIN-1).

El problema es que algunos de los códigos de bytes se asignan a códigos no asignados.

  • En el caso de Java, esos códigos no asignados se asignan a ? , ya sea cuando se crea la cadena o cuando se emite.
  • En el caso de Javascript, los códigos no asignados no están incluidos en la cadena o se eliminan cuando intenta mostrarlos.

Para que conste, así es como un decodificador base64 en línea lo anterior para mí:

 ����������������Æû$SF3«àöBâ

Los códigos no asignados son 0x91 0x82 y 0x93. 0x15 y 0x0B son códigos de control que no se imprimen.


Pero la conclusión es que no debe convertir estos datos en una cadena ni en Java ni en Javascript. Debe tratarse como binario; es decir, una matriz de valores de bytes.

about 4 years ago · Juan Pablo Isaza Denunciar

0

byte[] data = Base64.getDecoder().decode(str);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda