Ich habe ein Bild, das Base64-kodiert ist. Wie kann ich das am besten in Java dekodieren? Hoffentlich nur mit den Bibliotheken, die in Sun Java 6 enthalten sind.
Antworten
Zu viele Anzeigen?Ab dem Java 8 gibt es eine offiziell unterstützte API für die Base64-Kodierung und -Dekodierung. Mit der Zeit wird dies wahrscheinlich die Standardwahl werden.
Die API enthält die Klasse java.util.Base64
und ihre verschachtelten Klassen. Es unterstützt drei verschiedene Varianten: Basic, URL Safe und MIME.
Beispielcode mit der "einfachen" Kodierung:
import java.util.Base64;
byte[] bytes = "Hello, World!".getBytes("UTF-8");
String encoded = Base64.getEncoder().encodeToString(bytes);
byte[] decoded = Base64.getDecoder().decode(encoded);
String decodedStr = new String(decoded, StandardCharsets.UTF_8);
En Dokumentation für java.util.Base64
enthält mehrere weitere Methoden zur Konfiguration von Encodern und Decodern und zur Verwendung verschiedener Klassen als Ein- und Ausgänge (Byte-Arrays, Strings, ByteBuffers, java.io-Streams).
Seit Version 6 wird Java SE mit JAXB ausgeliefert. javax.xml.bind.DatatypeConverter
verfügt über statische Methoden, die dies vereinfachen. Siehe parseBase64Binary()
y printBase64Binary()
.
UPDATE : JAXB wird nicht mehr mit Java ausgeliefert (seit Java 11). Wenn JAXB für Ihr Projekt erforderlich ist, müssen Sie die entsprechenden Bibliotheken über Ihr Abhängigkeitsverwaltungssystem, z. B. Maven, konfigurieren. Wenn Sie den Compiler benötigen ( xjc.exe
) müssen Sie diese ebenfalls separat herunterladen.
Sie brauchen keine Commons zu verwenden - Sun liefert einen base64-Encoder mit Java. Sie können ihn als solchen importieren:
import sun.misc.BASE64Decoder;
Und dann verwenden Sie es so:
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);
Wo encodedBytes
ist entweder ein java.lang.String
oder eine java.io.InputStream
. Beachten Sie nur, dass die sun.*
Klassen werden von Sun nicht "offiziell unterstützt".
EDITAR: Wer hätte gedacht, dass dies die kontroverseste Antwort sein würde, die ich je veröffentlichen würde? Ich weiß, dass sun.*-Pakete nicht unterstützt werden oder garantiert weiter existieren, und ich kenne Commons und benutze es ständig. Der Poster fragte jedoch nach einer Klasse, die "in Sun Java 6 enthalten" ist, und das wollte ich beantworten. Ich stimme zu, dass Commons im Allgemeinen der beste Weg ist.
EDIT 2: Wie amir75 weiter unten ausführt, wird Java 6+ mit JAXB ausgeliefert, das unterstützten Code zur Codierung/Decodierung von Base64 enthält. Siehe bitte Jeremy Ross' Antwort unten.
Speziell in Commons Codec : Klasse Base64
a decode(byte[] array)
o encode(byte[] array)
Guava verfügt jetzt über eine integrierte Base64-Dekodierung.
Verwenden Sie BaseEncoding.base64().decode()
Für den Umgang mit möglichen Leerzeichen in der Eingabe verwenden Sie
BaseEncoding.base64().decode(CharMatcher.WHITESPACE.removeFrom(...));
参照 diese Diskussion für weitere Informationen
- See previous answers
- Weitere Antworten anzeigen
1 Stimmen
Unabhängig davon, welche Art von Anwendung Sie verwenden (Experiment oder nicht), ist es so einfach wie das Erstellen einer einzigen Base64.java-Datei in Ihrem utils-Paket mit dem Code hier: migbase64.sourceforge.net Schauen Sie sich die Leistungstabellen an und bemerken Sie den Unterschied: 4-5 mal so schnell.
0 Stimmen
ZU IHRER INFORMATION: GEP 135 schlägt vor, eine standardisierte, auffindbare API für die Java-Plattform einzuführen.
0 Stimmen
Es gibt Fortschritte: mail.openjdk.java.net/pipermail/core-libs-dev/2012-October/
2 Stimmen
Hier ist eine weitere Umsetzung, die ich vor kurzem durchgeführt habe: github.com/n1hility/playground/blob/master/src/main/java/org/
3 Stimmen
Wenn Sie eine Android-App entwickeln, hat Google dies bereits getan: developer.Android.com/reference/Android/util/Base64.html