wake-up-neo.com

Base64-Kodierung in Java/Groovy

Wie konvertiert man ein Byte [] in eine Base64-Zeichenfolge in Java? Besser noch wäre Grails/Groovy, weil es mir sagt, dass die Funktion encodeAsBase64() veraltet ist. Das Sun.misc.BASE64Encoder-Paket wird nicht empfohlen und gibt auf einigen Windows-Plattformen eine Zeichenfolge mit unterschiedlicher Größe aus.

25
Josh K
12
Evan Mulawski

Der bevorzugte Weg, dies in Groovy zu tun, ist:

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

Sie könnten die Open Source Base64Coder library verwenden

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=")
2
Mark O'Connor

Implementiere deine eigene Methode so :)

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

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()
}

}

0
srsajid

(Wenn Sie dies zu diesem Thread hinzufügen, in der Hoffnung, dass jemand anderes einen Treffer erzielt, ohne seine wertvolle Zeit zu verschwenden)?

Ich wurde heute stagniert, als ich versuchte, die Ausgabe von Grails 2.3.11/Groovy 2.1.9 hinzuzufügen

String src = render(
        model:    ...,
        template: ...,
    )
    .encodeAsBase64()

als data--Attribut für ein DOM-Element. Das atob() im entsprechenden JavaScript, d. H. Der Code, der die Base64-Zeichenfolge aus dem Datenattribut entschlüsselt, beschwert sich weiterhin über illegale Zeichen, während andere Decodierer, z. base64 -d hat dieselbe Base64-Zeichenfolge ohne Probleme akzeptiert.

Die Lösung besteht darin, den Rückgabewert render() für eine einzelne Zeichenfolge zu erzwingen und dann die Base64-Codierung anzuwenden, d. H.

String src = render(
        model:    ...,
        template: ...,
    )
    .toString()
    .encodeAsBase64()

oder (wenn Sie encodeAsBase64() als veraltet betrachten):

String src = render(
        model:    ...,
        template: ...,
    )
    .toString()
    .bytes
    .encodeBase64() // add 'true' for chunked output
0
Stefan Becker