2012-09-06 18 views
15

Necesito hacer la codificación Base64 desde la matriz de bytes a stirng en oposición a otra matriz de bytes. Pero cuando lo decodifico, obtengo una excepción. Aquí está el códigoError al intentar codificar/decodificar Cadena a Base64

Estoy tratando de codificar una matriz de bytes en una cadena usando la codificación Base64. Cuando codifico, parece que funciona, pero cuando decodizo arroja una excepción. ¿Qué estoy haciendo mal?

import org.springframework.security.crypto.codec.Base64; 

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = Base64.encode(bytes).toString(); 
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 

Aquí es la excepción que estoy recibiendo:

org.springframework.security.crypto.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 91 in array position 0 
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:625) 
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:246) 
+2

Debe aceptar una de las respuestas, si le funcionó. – jszakmeister

Respuesta

1

Esto funciona para mí:

 byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; 
     String stringToStore = Base64.encode(bytes); 
     //System.out.println(stringToStore);//AQIDBAUGBwgJ 
     byte[] restoredBytes = Base64.decode(stringToStore); 
     //System.out.println(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9] 

he editado un poco:

  • Dont llamada toString() en un String. encode(bytes) método ya devuelve un String (según lo observado por otros pidiendo esto podría ser qué es lo que resulta en el error)
  • Por qué convertir a los bytes cuando no es sólo necesitó más código (Base64.decode(stringToStore.getBytes()))
+0

¿Puede proporcionar un enlace a su clase Base64 cuya codificación() devuelve una cadena y no un byte [] –

16

Podría intentar ...

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = new String(Base64.encode(bytes)); 
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 
1
String stringToStore = Base64.encode(bytes).toString(); 

eso no es convertir los bytes en una cadena. Es la representación en cadena de Java del objeto (por ejemplo, "[[email protected]"). Debes hacer lo que sugiere la ichedral y proporcionar los bytes a una clase String.

0

Base64.decode() aparece en return a byte\[\]. Llamar al toString() le da una descripción Java predeterminada de la matriz, nada como "56AB0FC3 ...". Tendría que hacer esa conversión usted mismo.

Del mismo modo, su llamada a getBytes() no está haciendo para nada lo que piensa.

4

Base64.encode (bytes) .toString() no devuelve la cadena que espera.

Debe utilizar

new String(Base64.encode(bytes)) 

según lo sugerido por iccthedral.

0

Probé Base64 desde apache codec, y el resultado está bien.

import org.apache.commons.codec.binary.Base64; 
    byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    Base64 base64 = new Base64(); 
    byte[] stringToStore = base64.encode(bytes); 
    System.out.print(Arrays.toString(stringToStore));//[65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74] 
    byte[] restoredBytes = base64.decode(stringToStore); 
    System.out.print(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9] 
2

Si está utilizando la API de Android 8+ hay una clase Base64 ayudante en android.util.

String stringToStore = Base64.encodeToString(cipherText, Base64.DEFAULT); 
1

Inicialmente, si está utilizando esto para contraseñas, no se recomienda convertirlo en cadenas. Para utilizar como cadena siga el siguiente segmento de código

 

    byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
    String stringToStore = new String(Base64.encode(bytes), "UTF-8"); 
    byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 

0

a decodificar el conjunto de bytes, que contais contenido de base 64 puede utilizar javax.xml.bind.DatatypeConverter. Funciona bastante bienLo uso para descifrar los valores MongoDB de tipo binario.

String testString = "hi, I'm test string"; 
byte[] byteArrayBase64 = org.apache.commons.codec.digest.DigestUtils.md5(testString); 
String decoded = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArrayBase64); 
assert testString.equals(decoded); 
Cuestiones relacionadas