Signatur
Beschreibung
Der Konstruktor Uint8Array() legt ein typisiertes Array an, dessen Elemente vorzeichenlose 8-Bit-Ganzzahlen sind. Damit ist Uint8Array die übliche Darstellung für rohe Bytes: Dateiinhalte, Netzwerkdaten, Ergebnisse von TextEncoder, crypto.getRandomValues() oder Response.arrayBuffer().
Je nach Argument verhält sich der Konstruktor unterschiedlich:
- Ohne Argument oder mit einer Zahl: Es wird ein neuer, mit
0gefüllter Puffer mit der angegebenen Länge angelegt. - Mit einem typisierten Array, Array oder iterierbaren Objekt: Die Werte werden in einen neuen Puffer kopiert und dabei in den Bereich 0–255 umgewandelt (modulo 256).
- Mit einem
ArrayBufferoderSharedArrayBuffer: Es wird kein Speicher kopiert, sondern eine Sicht auf den bestehenden Puffer erzeugt, optional abbyteOffsetund mitlengthElementen. Änderungen wirken sich auf alle Sichten desselben Puffers aus.
Der Konstruktor darf nur mit new aufgerufen werden; ein Aufruf ohne new wirft einen TypeError. Die Länge eines typisierten Arrays ist fest, Methoden wie push() gibt es nicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $length | number | 0 | Anzahl der Elemente (= Bytes). Alle Elemente werden mit 0 initialisiert. |
| $typedArray | object | TypedArray | Array | Iterable | ArrayLike | Quelle, deren Werte in ein neues Uint8Array kopiert werden. Werte werden per ToUint8 umgewandelt (z. B. 256 → 0, -1 → 255). |
|
| $buffer | ArrayBuffer | SharedArrayBuffer | Bestehender Puffer, auf den das neue Array als Sicht zugreift – ohne Kopie. | |
| $byteOffset | number | 0 | Nur mit buffer: Start-Offset in Bytes innerhalb des Puffers. |
| $length | number | buffer.byteLength - byteOffset | Nur mit buffer: Anzahl der Elemente der Sicht. Ohne Angabe reicht die Sicht bis zum Pufferende. |
Rückgabewert
Uint8Array-Objekt – entweder mit eigenem Puffer oder als Sicht auf den übergebenen ArrayBuffer.Beispiele
Varianten der Erzeugung
const leer = new Uint8Array(4);
const ausArray = new Uint8Array([10, 255, 256, -1]);
const ausIterable = new Uint8Array(new Set([1, 2, 3]));
console.log(leer);
console.log(ausArray); // 256 → 0, -1 → 255
console.log(ausIterable);
Sicht auf einen ArrayBuffer (keine Kopie)
const buffer = new ArrayBuffer(8);
const gesamt = new Uint8Array(buffer);
const mitte = new Uint8Array(buffer, 2, 4); // Bytes 2..5
mitte.fill(0xff);
console.log(gesamt);
console.log(mitte.byteOffset, mitte.length);
Text in Bytes umwandeln und als Hex ausgeben
const bytes = new TextEncoder().encode('Hallö');
const kopie = new Uint8Array(bytes); // echte Kopie
const hex = Array.from(kopie, (b) => b.toString(16).padStart(2, '0')).join(' ');
console.log(kopie.length, hex);
Datei-Signatur aus einer Response prüfen
const istPng = async (url) => {
const res = await fetch(url);
const bytes = new Uint8Array(await res.arrayBuffer(), 0, 8);
const signatur = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
return signatur.every((b, i) => bytes[i] === b);
};
istPng('/logo.png').then(console.log);
// Wichtig · Fallstricke
- Kopie vs. Sicht:
new Uint8Array(andererTypedArray)kopiert,new Uint8Array(andererTypedArray.buffer)teilt den Speicher. Achtung:.bufferkann größer sein als das Array – immerbyteOffsetundbyteLengthmitgeben. - Überlauf: Werte außerhalb 0–255 werden modulo 256 umgebrochen, Nachkommastellen abgeschnitten,
NaNwird zu0. Für Begrenzung statt UmbruchUint8ClampedArrayverwenden. byteOffsetmuss beiUint8Arraynicht ausgerichtet sein (Elementgröße 1), aberbyteOffset + lengthdarfbuffer.byteLengthnicht überschreiten – sonstRangeError.- Ohne
newaufgerufen:TypeError. Sehr große Längen können einenRangeErrorauslösen. - Wird der zugrunde liegende Puffer übertragen (z. B. per
postMessagemit Transfer-Liste), ist die Sicht danach leer (length === 0). - Unterstützt in allen modernen Browsern und Node.js; Node-
Bufferist eine Unterklasse vonUint8Array. Neuere Methoden wieUint8Array.fromBase64()/toHex()sind noch nicht überall verfügbar.