Start · Sprachen · JavaScript · Referenz · Uint16Array

Uint16Array

Klasse

Typisiertes Array, das eine Folge von 16-Bit-Ganzzahlen ohne Vorzeichen (0–65535) in der Byte-Reihenfolge der Plattform speichert.

seit JavaScript ES2015 Kategorie: core

Signatur

class Uint16Array

Beschreibung

Uint16Array ist ein TypedArray und repräsentiert ein zusammenhängendes Speichersegment (ArrayBuffer), in dem jedes Element als vorzeichenloser 16-Bit-Integer (2 Byte) abgelegt wird. Gültige Werte liegen im Bereich 0 bis 65535. Werte außerhalb dieses Bereichs werden beim Schreiben modulo 65536 normiert (Wraparound).

Typische Einsatzgebiete sind Audioverarbeitung (PCM-Rohdaten), Bildverarbeitung (16-Bit-Farbkanäle), Binärprotokoll-Parsing sowie jede Situation, in der kompakter Speicher mit direktem Byte-Zugriff benötigt wird — z. B. in Kombination mit DataView, fetch-Streams oder WebSockets.

Alle TypedArray-Methoden stehen zur Verfügung: map(), filter(), reduce(), set(), subarray() u. v. m. Uint16Array-Instanzen teilen sich denselben ArrayBuffer mit anderen Views auf denselben Puffer, was Zero-Copy-Operationen ermöglicht.

Die Byte-Reihenfolge entspricht stets der nativen Byte-Reihenfolge der Plattform (meist Little-Endian). Wenn plattformunabhängige Byte-Reihenfolge benötigt wird (z. B. beim Netzwerk-Parsing), sollte stattdessen DataView verwendet werden, das explizites Endianness-Steuern erlaubt.

Parameter

Name Typ Default Beschreibung
$source number | ArrayBuffer | SharedArrayBuffer | ArrayLike | Iterable | TypedArray Initialisierungsquelle. Als number: Länge des Arrays (Anzahl Elemente). Als ArrayBuffer/SharedArrayBuffer: Puffer, auf den die View zeigt. Als ArrayLike oder Iterable: Werte werden kopiert und in Uint16 konvertiert. Als anderes TypedArray: Werte werden element-weise übernommen.
$byteOffset number 0 Nur bei ArrayBuffer-Quelle: Byte-Offset innerhalb des Puffers, an dem die View beginnt. Muss ein Vielfaches von 2 sein.
$length number Nur bei ArrayBuffer-Quelle: Anzahl der Elemente in der View. Standardmäßig werden alle verbleibenden Bytes des Puffers verwendet.

Rückgabewert

Typ
Uint16Array
Beschreibung
Eine neue Uint16Array-Instanz, die auf einen ArrayBuffer zeigt.

Beispiele

Array erstellen und Werte lesen/schreiben

// Leeres Uint16Array mit 4 Elementen anlegen
const arr = new Uint16Array(4);
arr[0] = 1000;
arr[1] = 65535;   // Maximalwert
arr[2] = 65536;   // Wraparound → 0
arr[3] = 300;

console.log(arr[0]); // 1000
console.log(arr[1]); // 65535
console.log(arr[2]); // 0 (Wraparound)
console.log(arr[3]); // 300
console.log(arr.byteLength); // 8 (4 × 2 Byte)
1000 65535 0 300 8

Aus Array-Literal und mit ArrayBuffer-View

// Aus einem normalen Array erzeugen
const from = Uint16Array.from([10, 20, 30, 40, 50]);
console.log(from.join(', ')); // 10, 20, 30, 40, 50

// Gemeinsamen ArrayBuffer mit zwei Views teilen
const buffer = new ArrayBuffer(8);
const view16 = new Uint16Array(buffer);       // 4 Elemente à 2 Byte
const view8  = new Uint8Array(buffer);        // 8 Elemente à 1 Byte

view16[0] = 0x0102;
console.log(view8[0], view8[1]); // Little-Endian: 2, 1
10, 20, 30, 40, 50 2 1

Binärdaten über fetch verarbeiten (Audio-Samples)

const loadSamples = async (url) => {
  const response = await fetch(url);
  const buffer   = await response.arrayBuffer();

  // Rohdaten als 16-Bit-PCM-Samples interpretieren
  const samples = new Uint16Array(buffer);
  const max     = samples.reduce((m, v) => Math.max(m, v), 0);

  console.log(`${samples.length} Samples, Max-Wert: ${max}`);
  return samples;
};

// loadSamples('/audio/raw-pcm.bin');

subarray() – Zero-Copy-Slice

const data = new Uint16Array([100, 200, 300, 400, 500]);

// subarray teilt denselben Puffer (kein Kopieren!)
const slice = data.subarray(1, 4);
console.log([...slice]); // [200, 300, 400]

// Schreiben in slice ändert auch data
slice[0] = 999;
console.log(data[1]); // 999
[200, 300, 400] 999

// Wichtig · Fallstricke

Byte-Reihenfolge (Endianness): Uint16Array schreibt und liest Werte immer in der nativen Byte-Reihenfolge des Prozessors. Auf nahezu allen Desktop- und Mobilplattformen ist das Little-Endian. Beim Austausch über Netzwerk-Protokolle, die Big-Endian vorschreiben (z. B. Netzwerk-Byte-Reihenfolge), muss DataView mit explizitem getUint16(offset, false) verwendet werden.

Kein Sparse-Array: Anders als reguläre JS-Arrays hat Uint16Array eine feste Länge, die nach der Erstellung nicht geändert werden kann. push(), pop(), splice() und ähnliche mutierende Array-Methoden sind nicht verfügbar.

Negative Indizes: at(-1) wird unterstützt (ES2022), numerische negative Indices direkt (z. B. arr[-1]) hingegen nicht — sie legen stattdessen eine gewöhnliche Eigenschaft an, ohne den Puffer zu modifizieren.

SharedArrayBuffer: Uint16Array kann auf einem SharedArrayBuffer aufgebaut werden. In diesem Fall sind atomare Zugriffe über Atomics-Methoden erforderlich, um Race Conditions in Web Workers zu vermeiden.