35 Stimmen

Base64-Kodierung in Java / Groovy

Was ist der richtige Weg, um ein Byte [] in eine Base64-Zeichenfolge in Java zu konvertieren? Besser noch wäre Grails / Groovy, weil es mir sagt, dass die encodeAsBase64() Funktion ist veraltet. Die Website sun.misc.BASE64Encoder Paket wird nicht zur Verwendung empfohlen und gibt auf einigen Windows-Plattformen eine Zeichenkette anderer Größe aus.

111voto

ataylor Punkte 62676

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"

0 Stimmen

Das Problem dabei ist, dass encodeBase64 setzt alle 76 Zeichen ein Zeilenende ein, was die Länge der Zeichenkette durcheinander bringt. Ich benutzte schließlich def encoded = byteArray.collect { it as char } anstelle einer Base64-Kodierung.

12 Stimmen

Standardmäßig fügt Groovy seit Version 1.6.0 keine zusätzlichen Zeilenumbrüche in die Kodierung ein. Aufruf von encodeBase64(true) ermöglicht dieses Verhalten.

14voto

Evan Mulawski Punkte 53325

2voto

Mark O'Connor Punkte 74233

Sie können die Open-Source-Software Base64Coder Bibliothek

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=")

2voto

srsajid Punkte 1479

Implementieren Sie Ihre eigene Methode wie diese :)

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

}

0voto

Stefan Becker Punkte 5491

(ich füge dies zu diesem Thema hinzu, in der Hoffnung, dass jemand anderes einen Treffer erhält und nicht seine wertvolle Zeit verschwenden muss)

Ich habe heute stymied, wenn ich versucht, in meinem Grails 2.3.11/Groovy 2.1.9 Anwendung die Ausgabe von hinzufügen

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

als data- Attribut an ein DOM-Element. Aber die atob() im entsprechenden JavaScript, d. h. der Code, der die Base64-Zeichenkette aus dem Datenattribut dekodiert, beschwerte sich ständig über illegale Zeichen, während andere Dekodierer, z. B. base64 -d die gleiche Base64-Zeichenkette ohne Probleme akzeptiert.

Die Lösung besteht darin, die render() Rückgabewert in eine einzelne Zeichenfolge umwandeln und dann die Base64-Kodierung anwenden, d. h.

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X