2012-07-23 11 views
8

Tratando de convertir una cadena de base 64 a byte[] usando org.apache.commons.codec.binary.Base64 ..for esta mi código java parece:conversión de matriz de bytes de Java cadena base64

base64String = Base64.encodeBase64URLSafeString(myByteArray); 

pero lo que veo es que algunos caracteres no válidos en el generada base64 cadena ... ScreenShot

¿Por qué veo estas líneas ____ en mi base64 cadena generada? ¿Es una cadena válida? Tenga en cuenta que la longitud de la cadena generada es divisible por cuatro.

+1

qué intenta decodificar la salida? Además, ¿está utilizando los datos base64 codificados en una URL? Utilice la versión de URLSafe solo cuando la codificación de base64 vaya a un http/get u otra operación relacionada con la url. – maasg

+0

http://en.wikipedia.org/wiki/Base64#URL_applications – nullpotent

+0

Esto podría ayudar a http://stackoverflow.com/questions/6265912/javax-xml-binds-base64-encoder-decoder-eats-last-two- Caracteres de cadena – tsm

Respuesta

2

Esto puede ser útil

sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); 
encoder.encode(byteArray); 
+14

Este es un mal consejo --- La jerarquía del paquete 'sun.misc' no es para uso público. –

+0

No quiero ir con 'sun.misc' –

0

que tienes (al menos) dos sabores de base 64, el original usando '+' y '/', además de caracteres alfanuméricos, y el "URL segura "uno", usando "-" y "_" para que el contenido se pueda incluir en una URL (o usar como un nombre de archivo, por cierto).

Parece que está utilizando un codificador base64 que se ha convertido en "modo seguro para url".

apache's javadoc for URLSafeString()

Ah, y '_' ser el último carácter del alfabeto base 64, ver las cadenas de "____" significa que has estado codificando trozos de 0xffffff ..., al igual que ver "AAAAAA" significa que hay una gran cantidad de ceros consecutivos.

Si quiere estar convencido de que es un caso normal, simplemente elija su dumper/editor hexadecimal favorito y compruebe cómo se veía su entrada binaria.

+0

Parece un comentario válido entre todos sí Tengo'/'y repliqué el método de econding con' encodeBase64URLSafeString' para evitar barras ... Entonces todo comenzó con '_' .. Todo lo que necesito saber es que lo anterior es una cadena base64 válida? Sugiero amablemente. –

+0

pregunta si la cadena coincide con [0-9A-Za-z _-] + o [0-9A-Za-z/+] +? eso suena como un trabajo para una expresión regular. – PypeBros

0

Por el proceso a continuación se puede convertir matriz de bytes en base 64

// Convert a byte array to base64 string 
    byte[] bytearray= new byte[]{0x12, 0x23}; 
    String s = new sun.misc.BASE64Encoder().encode(bytearray); 

    // Convert base64 string to a byte array 
    bytearray = new sun.misc.BASE64Decoder().decodeBuffer(s); 

Editar:

favor, consulte las instrucciones de abajo enlace commons apache

+0

'sun.misc.BASE64Decoder()' ?? ¿Por qué lo intento con apache commons? –

+2

sun.misc es algo interno a la implementación de paquetes java/javax de Sun. No hay garantía de que siempre estará allí (especialmente en una JVM diferente) ni que su interfaz seguirá siendo la misma en las diferentes versiones de la JVM, afaik. – PypeBros

2

¿Ha tratado con el método encodeBase64String en lugar de usar encodeBase64URLSafeString?

encodeBase64URLSafeString:

Codifica los datos binarios mediante una variación en URL segura del algoritmo base 64 pero no la salida trozo. La variación de seguridad en la url emite - y _ en lugar de + y/caracteres.

encodeBase64String:

codifica los datos binarios utilizando el algoritmo de base 64, pero no la salida trozo . NOTA: Cambiamos el comportamiento de este método de multitronificación fragmentación (commons-codec-1.4) a línea única no fragmentación (commons-codec-1.5).

fuente: org.apache.commons.codec.binary.Base64 javadoc

0

Uso

String sCert = javax.xml.bind.DatatypeConverter.printBase64Binary(pk); 
Cuestiones relacionadas