Signatur
Beschreibung
setFromBase64() dekodiert einen Base64- oder Base64URL-kodierten String und schreibt die Bytes direkt in das bestehende Array. Es wird kein neuer Puffer angelegt. Die Methode gehört zu Uint8Array.fromBase64(), das immer ein neues Array erzeugt. setFromBase64() lohnt sich, wenn Sie Speicher wiederverwenden wollen, zum Beispiel für einen festen Puffer, einen Ringpuffer oder beim Schreiben an eine bestimmte Stelle über subarray().
Das Ergebnis ist ein Objekt { read, written }. read ist die Anzahl der verarbeiteten Zeichen des Eingabe-Strings, Leerzeichen eingeschlossen. written ist die Anzahl der geschriebenen Bytes. Wenn das Array zu klein ist, bricht die Methode ohne Fehler vor dem ersten 4-Zeichen-Block ab, dessen Bytes nicht mehr hineinpassen. Mit read können Sie danach an der richtigen Stelle im String weitermachen. Bytes hinter written bleiben unverändert.
Mit den Optionen legen Sie das Alphabet fest ("base64" oder das URL-sichere "base64url"). Außerdem bestimmen Sie, wie der letzte, eventuell unvollständige Block behandelt wird. Für das schrittweise Dekodieren von Datenströmen ist lastChunkHandling: "stop-before-partial" gedacht: Ein unvollständiger Rest wird dann nicht dekodiert und kann mit dem nächsten Teilstück zusammengefügt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der Base64-kodierte String. ASCII-Leerzeichen (Leerzeichen, Tab, Zeilenumbrüche) werden ignoriert. Ist der Wert kein String, wird ein TypeError ausgelöst. |
|
| $options | object | {} | Optionales Einstellungsobjekt mit den folgenden Eigenschaften. |
| $options.alphabet | "base64" | "base64url" | "base64" | Das Alphabet: "base64" nutzt + und /, "base64url" nutzt - und _. |
| $options.lastChunkHandling | "loose" | "strict" | "stop-before-partial" | "loose" | Behandlung des letzten Blocks. "loose": Fehlendes Padding wird akzeptiert. "strict": Korrektes =-Padding ist Pflicht, und nicht verwendete Bits müssen 0 sein, sonst gibt es einen SyntaxError. "stop-before-partial": Ein unvollständiger Block am Ende wird nicht dekodiert; das ist für Datenströme gedacht. |
Rückgabewert
read (Anzahl der gelesenen Zeichen des Strings) und written (Anzahl der in das Array geschriebenen Bytes).Beispiele
Base64 in einen vorhandenen Puffer dekodieren
const buffer = new Uint8Array(8);
const { read, written } = buffer.setFromBase64("SGVsbG8=");
console.log(read, written);
console.log(new TextDecoder().decode(buffer.subarray(0, written)));
An einem Offset schreiben mit subarray()
// Ein 4-Byte-Header ist schon vorhanden, die Nutzdaten kommen dahinter
const packet = new Uint8Array(10);
packet.set([0xCA, 0xFE, 0x00, 0x03]);
const result = packet.subarray(4).setFromBase64("AQID");
console.log(result);
console.log(packet);
Zu kleines Ziel-Array und URL-sicheres Alphabet
// Nur 5 Bytes Platz: Der zweite 4er-Block (3 Bytes) passt nicht mehr
const small = new Uint8Array(5);
const res = small.setFromBase64("3q2-7w", { alphabet: "base64url" });
console.log(res, small);
// Mit genug Platz wird alles dekodiert
const full = new Uint8Array(4);
console.log(full.setFromBase64("3q2-7w", { alphabet: "base64url" }), full);
Datenstrom schrittweise dekodieren mit stop-before-partial
const chunks = ["SGVsbG8s", "IFdlbHQ", "h"]; // "Hello, Welt!" in Teilstücken
const out = new Uint8Array(64);
let offset = 0;
let rest = "";
chunks.forEach((chunk, i) => {
const isLast = i === chunks.length - 1;
const input = rest + chunk;
const { read, written } = out.subarray(offset).setFromBase64(input, {
lastChunkHandling: isLast ? "loose" : "stop-before-partial",
});
offset += written;
rest = input.slice(read); // nicht verarbeiteten Rest aufheben
});
console.log(new TextDecoder().decode(out.subarray(0, offset)));