Heim  >  Artikel  >  Java  >  So implementieren Sie den Base64-Encoder in Java

So implementieren Sie den Base64-Encoder in Java

PHPz
PHPznach vorne
2023-04-28 16:04:221176Durchsuche

Einführung

Was ist Base64-Kodierung? Bevor wir diese Frage beantworten, müssen wir die Klassifizierung von Dateien in Computern verstehen. Bei Computern können Dateien in zwei Kategorien unterteilt werden: eine in Textdateien und eine in Binärdateien.

Bei Binärdateien wird ihr Inhalt binär dargestellt, was für Menschen nicht sofort verständlich ist. Wenn Sie versuchen, eine Binärdatei mit einem Texteditor zu öffnen, wird möglicherweise Kauderwelsch angezeigt. Dies liegt daran, dass sich die Kodierungsmethode von Binärdateien von der Kodierungsmethode von Textdateien unterscheidet. Wenn der Texteditor daher versucht, die Binärdateien in Textinhalte zu übersetzen, werden verstümmelte Zeichen angezeigt.

Für Textdateien gibt es viele Kodierungsmethoden, beispielsweise die früheste ASCII-Kodierung und die derzeit am häufigsten verwendeten Kodierungsmethoden wie UTF-8 und UTF-16. Sogar Textdateien können verstümmelte Zeichen sehen, wenn Sie sie mit einer anderen Kodierung öffnen.

Ob es sich also um eine Textdatei oder eine Binärdatei handelt, das Codierungsformat muss vereinheitlicht werden. Mit anderen Worten: Wie die Codierung des Schreibens aussieht, sollte auch die Codierung des Datenlesens damit übereinstimmen.

Base64-Kodierung ist eigentlich eine Kodierungsmethode, die Binärdaten in visuelle ASCII-Zeichen kodiert.

Warum gibt es eine solche Anforderung?

Wir wissen, dass die Entwicklung der Computerwelt nicht über Nacht erfolgt. Bei der Zeichenkodierung wurde zunächst nur die ASCII-Kodierung unterstützt und später auf Unicode ausgeweitet. Daher werden für viele Anwendungen andere Codierungsformate als die ASCII-Codierung nicht unterstützt. Wie kann also Nicht-ASCII-Code in diesen Systemen angezeigt werden?

Die Lösung besteht darin, eine Codierungszuordnung durchzuführen, um Nicht-ASCII-Zeichen in ASCII-Zeichen abzubilden. Base64 ist eine solche Kodierungsmethode.

Base64 wird häufig auf Webseiten verwendet. Manchmal müssen wir Bilder auf Webseiten anzeigen, damit wir die Bilder mit Base64 kodieren und sie dann in HTML füllen können.

Eine weitere Anwendung besteht darin, die Datei mit Base64 zu kodieren und sie dann als E-Mail-Anhang zu versenden.

JAVAs Unterstützung für Base64

Da die Base64-Kodierung so einfach zu verwenden ist, werfen wir einen Blick auf die Base64-Implementierung in JAVA.

Es gibt eine entsprechende Base64-Implementierung in Java mit dem Namen java.util.Base64. Diese Klasse ist eine Toolklasse für Base64, die von JDK in Version 1.8 eingeführt wurde.

Base64 bietet drei getEncoder- und getDecoder-Methoden. Durch den Erwerb der entsprechenden Encoder- und Decoder-Methoden können Sie dann die Codierungs- und Decodierungsmethoden des Encoders aufrufen, um die Daten zu codieren und zu decodieren.

Werfen wir zunächst einen Blick auf die grundlegenden Anwendungsbeispiele von Base64:

 // 使用encoder进行编码
 String encodedString = Base64.getEncoder().encodeToString("what is your name baby?".getBytes("utf-8"));
 System.out.println("Base64编码过后的字符串 :" + encodedString);

 // 使用encoder进行解码
 byte[] decodedBytes = Base64.getDecoder().decode(encodedString);

 System.out.println("解码过后的字符串: " + new String(decodedBytes, "utf-8"));

Als Toolklasse ist die im JDK bereitgestellte Base64-Toolklasse immer noch sehr nützlich.

Ich werde seine Verwendung hier nicht im Detail erklären. In diesem Artikel wird hauptsächlich analysiert, wie Base64 im JDK implementiert wird.

Klassifizierung und Implementierung von Base64 im JDK

Die Base64-Klasse im JDK bietet drei Encoder-Methoden, nämlich getEncoder, getUrlEncoder und getMimeEncoder:

    public static Encoder getEncoder() {
         return Encoder.RFC4648;
    }

    public static Encoder getUrlEncoder() {
         return Encoder.RFC4648_URLSAFE;
    }

    public static Encoder getMimeEncoder() {
        return Encoder.RFC2045;
    }

Ähnlich stellt sie auch drei entsprechende Decoder bereit, nämlich getDecoder, getUrlDecoder, getMimeDecoder:

    public static Decoder getDecoder() {
         return Decoder.RFC4648;
    }

    public static Decoder getUrlDecoder() {
         return Decoder.RFC4648_URLSAFE;
    }

    public static Decoder getMimeDecoder() {
         return Decoder.RFC2045;
    }

Wie aus dem Code ersichtlich ist, entsprechen diese drei Codierungen RFC4648, RFC4648_URLSAFE bzw. RFC2045.

Diese drei sind alles Varianten der Base64-Kodierung. Schauen wir uns ihre Unterschiede an:

RFC 2045: Base64-Übertragungskodierung für MIME= Obligatorisch
Kodierungsname Kodiertes Zeichen Kodiertes Zeichen
62. Position Bit 63 Vollständiges Zeichen
+ /+ / = mandatory
RFC 4648: base64 (standard) + / = optional
RFC 4648: base64url (URL- and filename-safe standard) - _ =

RFC 4648: base64 (Standard)

+

/

= optional

RFC 4648: base64url (URL- und Dateinamen-sicherer Standard)

-

_

= optional

🎜🎜🎜🎜kann gesehen werden Der Unterschied zwischen base64 und Base64url besteht darin, dass das 62. und 63. codierte Zeichen unterschiedlich sind, und der Unterschied zwischen Base64 für MIME und Base64 besteht darin, ob das Vervollständigungszeichen obligatorisch ist. 🎜🎜Außerdem werden für Basic und base64url keine Zeilentrennzeichen hinzugefügt, während base64 für MIME „r“ und „n“ als Zeilentrennzeichen hinzufügt, nachdem eine Zeile 76 Zeichen überschreitet. 🎜🎜Wenn schließlich während des Dekodierungsvorgangs festgestellt wird, dass Zeichen, die nicht in der Base64-Zuordnungstabelle vorhanden sind, unterschiedlich verarbeitet werden, werden sie von base64 und Base64url direkt abgelehnt, während base64 für MIME sie ignoriert. 🎜🎜Der Unterschied zwischen base64 und Base64url lässt sich anhand der folgenden zwei Methoden erkennen: 🎜
        private static final char[] toBase64 = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
        };
        private static final char[] toBase64URL = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
        };
🎜Für MIME definiert es die maximale Anzahl von Zeichen in einer Zeile und Zeilenumbrüchen: 🎜
        private static final int MIMELINEMAX = 76;
        private static final byte[] CRLF = new byte[] {'\r', '\n'};
🎜Erweiterte Verwendung von Base64🎜🎜Allgemein Hier In diesem Fall ist die Länge des mit Base64 codierten Objekts festgelegt. Wir müssen nur das Eingabeobjekt in ein Byte-Array konvertieren, um die Codierungs- oder Decodierungsmethode aufzurufen. 🎜🎜Aber in einigen Fällen müssen wir Stream-Daten konvertieren. In diesem Fall können wir die beiden in Base64 bereitgestellten Methoden zum Umschließen von Streams verwenden: 🎜
        public OutputStream wrap(OutputStream os) {
            Objects.requireNonNull(os);
            return new EncOutputStream(os, isURL ? toBase64URL : toBase64,
                                       newline, linemax, doPadding);
        }
        public InputStream wrap(InputStream is) {
            Objects.requireNonNull(is);
            return new DecInputStream(is, isURL ? fromBase64URL : fromBase64, isMIME);
        }
🎜Diese beiden Methoden entsprechen Encoder bzw. Decoder. 🎜

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Base64-Encoder in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen