Java Base64-Codierung und -Decodierung

1. Übersicht

In diesem Tutorial werden die verschiedenen Dienstprogramme erläutert, die Base64-Codierungs- und -Decodierungsfunktionen in Java bereitstellen.

Wir werden hauptsächlich die neuen Java 8-APIs und die Utility-APIs veranschaulichen, die aus Apache Commons stammen.

2. Java 8 für Base 64

Java 8 hat der Standard-API endlich Base64-Funktionen hinzugefügt . Dies erfolgt über die Dienstprogrammklasse java.util.Base64 .

Beginnen wir mit einem grundlegenden Encoder-Prozess.

2.1. Java 8 Basic Base64

Der Basiscodierer hält die Dinge einfach und codiert die Eingabe unverändert ohne Zeilentrennung.

Die Ausgabe wird einem Zeichensatz in A-Za-z0-9 + / Zeichensatz zugeordnet, und der Decoder lehnt alle Zeichen außerhalb dieses Satzes ab.

Codieren wir zunächst einen einfachen String :

String originalInput = "test input"; String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes()); 

Beachten Sie, wie wir die vollständige Encoder-API über die einfache Dienstprogrammmethode getEncoder () abrufen .

Lassen Sie uns diesen String nun wieder in die ursprüngliche Form dekodieren:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString); String decodedString = new String(decodedBytes);

2.2. Java 8 Base64-Codierung ohne Auffüllen

Bei der Base64-Codierung muss die Länge der ausgabecodierten Zeichenfolge ein Vielfaches von drei sein. Wenn nicht, wird die Ausgabe mit zusätzlichen Pad-Zeichen ( = ) aufgefüllt .

Beim Decodieren werden diese zusätzlichen Füllzeichen verworfen. Weitere Informationen zum Auffüllen in Base64 finden Sie in dieser detaillierten Antwort zum Stapelüberlauf.

Wenn wir das Auffüllen der Ausgabe überspringen müssen - vielleicht weil der resultierende String niemals zurückdecodiert wird - können wir einfach wählen, ohne Auffüllen zu codieren :

String encodedString = Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

2.3. Java 8 URL-Codierung

Die URL-Codierung ist dem oben beschriebenen Basis-Encoder sehr ähnlich. Es verwendet das URL- und Dateinamen-Safe-Base64-Alphabet und fügt keine Zeilentrennung hinzu:

String originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes()); 

Die Dekodierung erfolgt auf die gleiche Weise. Die Dienstprogrammmethode getUrlDecoder () gibt einen java.util.Base64.Decoder zurück , der dann zum Dekodieren der URL verwendet wird:

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl); String decodedUrl = new String(decodedBytes); 

2.4. Java 8 MIME-Codierung

Beginnen wir mit der Generierung einiger grundlegender MIME-Eingaben zum Codieren:

private static StringBuilder getMimeBuffer() { StringBuilder buffer = new StringBuilder(); for (int count = 0; count < 10; ++count) { buffer.append(UUID.randomUUID().toString()); } return buffer; }

Der MIME-Encoder generiert eine Base64-codierte Ausgabe unter Verwendung des Basisalphabets, jedoch in einem MIME-freundlichen Format.

Jede Zeile der Ausgabe darf nicht länger als 76 Zeichen sein und endet mit einem Wagenrücklauf, gefolgt von einem Zeilenvorschub ( \ r \ n ):

StringBuilder buffer = getMimeBuffer(); byte[] encodedAsBytes = buffer.toString().getBytes(); String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

Die Dienstprogrammmethode getMimeDecoder () gibt einen java.util.Base64.Decoder zurück , der dann beim Decodierungsprozess verwendet wird:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime); String decodedMime = new String(decodedBytes); 

3. Codieren / Decodieren mit Apache Commons Code

Zuerst müssen wir die Commons-Codec-Abhängigkeit in der pom.xml definieren :

 commons-codec commons-codec 1.10 

Beachten Sie, dass wir überprüfen können, ob neuere Versionen der Bibliothek in Maven Central veröffentlicht wurden.

Die Haupt-API ist die Klasse org.apache.commons.codec.binary.Base64 , die mit verschiedenen Konstruktoren parametrisiert werden kann:

  • Base64 (boolean urlSafe) erstellt die Base64-API durch Steuern des URL-sicheren Modus - ein oder aus.
  • Base64 (int lineLength) erstellt die Base64-API in einem URL-unsicheren Modus und steuert die Länge der Zeile (Standard ist 76).
  • Base64 (int lineLength, byte [] lineSeparator) erstellt die Base64-API, indem ein zusätzliches Zeilentrennzeichen akzeptiert wird, das standardmäßig CRLF ("\ r \ n") ist.

Sobald die Base64-API erstellt wurde, sind sowohl die Codierung als auch die Decodierung recht einfach:

String originalInput = "test input"; Base64 base64 = new Base64(); String encodedString = new String(base64.encode(originalInput.getBytes())); 

Die decode () -Methode der Base64- Klasse gibt die decodierte Zeichenfolge zurück:

String decodedString = new String(base64.decode(encodedString.getBytes())); 

Eine andere einfache Option ist die Verwendung der statischen API von Base64, anstatt eine Instanz zu erstellen:

String originalInput = "test input"; String encodedString = new String(Base64.encodeBase64(originalInput.getBytes())); String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

4. Konvertieren eines Strings in ein Byte- Array

Manchmal müssen wir einen String in ein Byte [] konvertieren . Der einfachste Weg, dies zu tun, ist die Verwendung der String getBytes () -Methode:

String originalInput = "test input"; byte[] result = originalInput.getBytes(); assertEquals(originalInput.length(), result.length);

It's better to provide encoding as well and not depend on default encoding, as it's system dependent:

String originalInput = "test input"; byte[] result = originalInput.getBytes(StandardCharsets.UTF_16); assertTrue(originalInput.length() < result.length);

If our String is Base64 encoded, we can use the Base64 decoder:

String originalInput = "dGVzdCBpbnB1dA=="; byte[] result = Base64.getDecoder().decode(originalInput); assertEquals("test input", new String(result));

We can also use DatatypeConverter parseBase64Binary() method:

String originalInput = "dGVzdCBpbnB1dA=="; byte[] result = DatatypeConverter.parseBase64Binary(originalInput); assertEquals("test input", new String(result));

Finally, we can convert a hexadecimal String to a byte[] using DatatypeConverter method:

String originalInput = "7465737420696E707574"; byte[] result = DatatypeConverter.parseHexBinary(originalInput); assertEquals("test input", new String(result));

5. Conclusion

This article explained the basics of how to do Base64 encoding and decoding in Java using the new APIs introduced in Java 8 and Apache Commons.

Schließlich gibt es einige andere erwähnenswerte APIs, die ähnliche Funktionen bieten: java.xml.bind.DataTypeConverter mit printHexBinary und parseBase64Binary .

Code-Schnipsel finden Sie auf GitHub.