Base64
Base64 ist eine Gruppe von ähnlichen Kodierungsschemata von Binär-zu-Text, die binäre Daten in einem ASCII-String-Format darstellen, indem sie in eine Basis-64-Darstellung umgewandelt werden. Der Begriff Base64 stammt von einer spezifischen MIME-Inhaltsübertragungskodierung.
Wenn der Begriff "Base64" alleinstehend verwendet wird, um auf einen spezifischen Algorithmus zu verweisen, bezieht er sich in der Regel auf die Version von Base64, die in RFC 4648, Abschnitt 4, definiert ist und das folgende Alphabet verwendet, um die Basis-64-Ziffern darzustellen, zusammen mit =
als Füllzeichen:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Eine häufige Variante ist "Base64 URL safe", die das Padding weglässt und +/
durch -_
ersetzt, um Zeichen zu vermeiden, die in URL-Pfadsegmenten oder Abfrageparametern Probleme verursachen könnten. Diese Kodierung benötigen Sie nicht, wenn Sie die Daten nicht in einem Pfadsegment oder Abfrageparameter verwenden — zum Beispiel haben Data-URLs weder das eine noch das andere und können die standardmäßige Base64-Kodierung verwenden.
Base64-Kodierungsschemata werden häufig verwendet, um binäre Daten zu kodieren, die in Medien gespeichert oder übertragen werden sollen, die nur mit ASCII-Text (oder einer ASCII-Erweiterung, die dennoch keine beliebigen binären Daten akzeptiert) umgehen können. Dies stellt sicher, dass die Daten während des Transports ohne Änderungen intakt bleiben. Häufige Anwendungen von Base64 sind:
Erhöhte Kodierungsgröße
Jede Base64-Ziffer stellt 6 Bits an Daten dar. So können drei 8-Bit-Bytes der Eingabestrings/-datei (3×8 Bits = 24 Bits) durch vier 6-Bit-Base64-Ziffern (4×6 = 24 Bits) dargestellt werden.
Dies bedeutet, dass die Base64-Version eines Strings oder einer Datei typischerweise etwa ein Drittel größer ist als ihre Quelle (die genaue Größenvergrößerung hängt von verschiedenen Faktoren ab, wie z.B. der absoluten Länge des Strings, seiner Länge modulo 3 und ob Füllzeichen verwendet werden).
Letzter Block
Der Base64-String kann in Blöcke von 4 Zeichen unterteilt werden, wobei der letzte Block weniger als 4 Zeichen haben kann. Der letzte Block kann mit =
Zeichen aufgefüllt werden, sodass er genau 4 Zeichen lang ist. Ohne Füllzeichen kann der letzte Block einer der folgenden sein:
- 2 Zeichen: kodiert 12 Bits, die 1 Byte (8 Bits) an Daten repräsentieren
- 3 Zeichen: kodiert 18 Bits, die 2 Bytes (16 Bits) an Daten repräsentieren
- 4 Zeichen: kodiert 24 Bits, die 3 Bytes (24 Bits) an Daten repräsentieren
In den ersten beiden Fällen können die Zeichen 4 oder 2 zusätzliche nachfolgende Bits enthalten, die keine Daten darstellen. In diesem Fall verlangt RFC 4648 von Kodierern, diese Bits auf Null zu setzen, und von Dekodierern, optional einen Fehler auszulösen, wenn sie nicht Null sind. Beispielsweise, wenn die kodierten Daten ein einzelnes Byte 0b01010101
sind, dann benötigt es zwei Zeichen 0b010101
(V
) und 0b010000
(Q
), wo das zweite Zeichen 4 nachfolgende Bits auf Null gesetzt hat. Das Dekodieren von VR==
(wo das zweite Zeichen 0b010001
darstellt) ergibt technisch dasselbe Byte 0b01010101
, aber der Dekodierer könnte einen Fehler verursachen, weil die nachfolgenden Bits nicht Null sind.
JavaScript-Unterstützung
Die Klasse Uint8Array
bietet die Methoden Uint8Array.fromBase64()
, Uint8Array.prototype.toBase64()
, und Uint8Array.prototype.setFromBase64()
für die Konvertierung zu/von base64-Strings.
Browser bieten auch nativ zwei JavaScript-Funktionen zum Dekodieren und Kodieren von Base64-Strings:
Window.btoa()
(auch in Web Workern verfügbar): erstellt einen Base64-kodierten ASCII-String aus einem String von binären Daten ("btoa" sollte als "binary to ASCII" gelesen werden).Window.atob()
(auch in Web Workern verfügbar): dekodiert einen Base64-kodierten String ("atob" sollte als "ASCII to binary" gelesen werden).
Hinweis:
Base64 ist eine binäre Kodierung und keine Textkodierung, aber btoa
und atob
wurden zur Webplattform hinzugefügt, bevor sie binäre Datentypen unterstützte. Infolgedessen verwenden die beiden Funktionen Strings, um binäre Daten darzustellen, wobei der Codepunkt jedes Zeichens den Wert jedes Bytes repräsentiert. Dies hat zu dem Missverständnis geführt, dass btoa
verwendet werden kann, um beliebige Textdaten zu kodieren - zum Beispiel, um eine Base64 data:
URL eines Text- oder HTML-Dokuments zu erstellen.
Jedoch hält die Byte-zu-Codepunkt-Entsprechung nur zuverlässig für Codepunkte bis 0x7f
. Außerdem führen Codepunkte über 0xff
dazu, dass btoa
einen Fehler auslöst, weil der Maximalwert für 1 Byte überschritten wird. Der nächste Abschnitt beschreibt, wie man dieses Problem umgeht, wenn man beliebigen Unicode-Text kodiert.