2010-11-15 43 views
22

¿Cuál es la forma correcta de convertir un byte [] a una cadena Base64 en Java? Mejor aún sería Grails/Groovy porque me dice que la función encodeAsBase64() está en desuso. No se recomienda el uso del paquete sun.misc.BASE64Encoder y genera una cadena de tamaño diferente en algunas plataformas de Windows.Codificación Base64 en Java/Groovy

Respuesta

2

podría utilizar el código abierto Base64Coder biblioteca

import biz.source_code.base64Coder.Base64Coder 

@Grab(group='biz.source_code', module='base64coder', version='2010-09-21') 

String s1 = Base64Coder.encodeString("Hello world") 
String s2 = Base64Coder.decodeString("SGVsbG8gd29ybGQ=") 
76

La mejor forma de hacerlo esto en groovy es:

def encoded = "Hello World".bytes.encodeBase64().toString() 
assert encoded == "SGVsbG8gV29ybGQ=" 
def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64()) 
assert decoded == "Hello World" 
+0

El problema con esto es que 'encodeBase64' pone línea de una línea que termina en cada 76 caracteres que meta la pata de la longitud de la cuerda. Terminé usando 'def encoded = byteArray.collect {it as char}' en lugar de una codificación Base64. –

+9

De forma predeterminada, groovy no inserta nuevas líneas adicionales en la codificación, desde la versión 1.6.0. Llamar 'encodeBase64 (true)' habilita ese comportamiento. – ataylor

+2

+1 para una solución simple y concisa que puedo usar en un guion pequeño y rápido (sin ningún deps de lib) necesito verificar algunas cosas :-) – jpswain

0

implementar su propio método como este :)

public class Coder { 
private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

public static String encodeAsBase64(String toEncode) { 
    return encodeAsBase64(toEncode.getBytes()) 
} 

public static String encodeAsBase64(byte[] toEncode) { 
    int pos = 0; 
    int onhand = 0; 

    StringBuffer buffer = new StringBuffer(); 
    for(byte b in toEncode) { 
     int read = b; 
     int m; 
     if(pos == 0) { 
      m = (read >> 2) & 63; 
      onhand = read & 3; 
      pos = 1; 
     } else if(pos == 1) { 
      m = (onhand << 4) + ((read >> 4) & 15); 
      onhand = read & 15; 
      pos = 2; 
     } else if(pos == 2) { 
      m = ((read >> 6) & 3) + (onhand << 2); 
      onhand = read & 63; 
      buffer.append(base64code.charAt(m)); 
      m = onhand; 
      onhand = 0; 
      pos = 0; 
     } 
     buffer.append(base64code.charAt(m)); 
    } 
    while(pos > 0 && pos < 4) { 
     pos++; 
     if(onhand == -1) { 
      buffer.append('='); 
     } else { 
      int m = pos == 2 ? onhand << 4 : (pos == 3 ? onhand << 2 : onhand); 
      onhand = -1; 
      buffer.append(base64code.charAt(m)); 
     } 
    } 
    return buffer.toString() 
} 

}

Cuestiones relacionadas