Signatur
Beschreibung
getUint16() liest zwei aufeinanderfolgende Bytes aus dem zugrunde liegenden ArrayBuffer (oder SharedArrayBuffer) und setzt sie zu einer vorzeichenlosen 16-Bit-Ganzzahl im Bereich 0 bis 65535 zusammen. Der Offset bezieht sich auf den Anfang des DataView, nicht auf den Anfang des Buffers.
Anders als bei einem Uint16Array legst du die Byte-Reihenfolge selbst fest: Standardmäßig wird Big-Endian gelesen (höherwertiges Byte zuerst, „Network Byte Order“). Mit littleEndian = true wird das niederwertige Byte zuerst gelesen, wie es bei x86/ARM-Prozessoren und vielen Dateiformaten (BMP, WAV, ZIP) üblich ist.
Typische Anwendungsfälle sind das Parsen von Binärformaten und Protokollen: Header von Dateien, Portnummern in Netzwerkpaketen, Längenfelder, Pixeldaten oder Audio-Samples. Außerdem muss der Offset nicht ausgerichtet sein – ungerade Offsets sind erlaubt, was mit typisierten Arrays nicht geht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $byteOffset Pflicht | number | Offset in Bytes ab dem Anfang des DataView, an dem gelesen wird. Wird in eine Ganzzahl umgewandelt; muss zwischen 0 und byteLength - 2 liegen. |
|
| $littleEndian | boolean | false | true liest im Little-Endian-Format, false oder weggelassen liest im Big-Endian-Format. |
Rückgabewert
0 bis 65535.Beispiele
Big-Endian und Little-Endian im Vergleich
const buffer = new ArrayBuffer(2);
const view = new DataView(buffer);
view.setUint8(0, 0x12);
view.setUint8(1, 0x34);
console.log(view.getUint16(0).toString(16)); // Big-Endian
console.log(view.getUint16(0, true).toString(16)); // Little-Endian
Breite und Höhe aus einem BMP-ähnlichen Header lesen
// Simulierter Header: Signatur 'BM', danach Breite und Höhe (je 16 Bit, Little-Endian)
const bytes = new Uint8Array([0x42, 0x4d, 0x80, 0x02, 0xe0, 0x01]);
const view = new DataView(bytes.buffer);
const signatur = String.fromCharCode(view.getUint8(0), view.getUint8(1));
const breite = view.getUint16(2, true);
const hoehe = view.getUint16(4, true);
console.log(`${signatur}: ${breite}x${hoehe}`);
Portnummern aus einem TCP-Header lesen (Network Byte Order)
// Die ersten 4 Bytes eines TCP-Headers: Quell- und Zielport, Big-Endian
const header = new Uint8Array([0xc3, 0x50, 0x01, 0xbb]);
const view = new DataView(header.buffer);
const quellPort = view.getUint16(0);
const zielPort = view.getUint16(2);
console.log({ quellPort, zielPort });
Vorzeichenlos vs. vorzeichenbehaftet und Bereichsfehler
const view = new DataView(new ArrayBuffer(4));
view.setUint16(0, 0xffff);
console.log(view.getUint16(0)); // 65535
console.log(view.getInt16(0)); // -1
try {
view.getUint16(3); // bräuchte die Bytes 3 und 4
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Standard ist Big-Endian: Lässt du
littleEndianweg, wird Big-Endian gelesen. Die meisten Dateiformate (BMP, WAV, PNG-Chunks nicht, dort gilt Big-Endian!) und die Prozessoren im Alltag arbeiten aber mit Little-Endian. Den Parameter falsch zu setzen, ist die häufigste Fehlerquelle. - RangeError: Wird ausgelöst, wenn
byteOffsetnegativ ist oderbyteOffset + 2größer alsbyteLengthdes Views ist. - Offset relativ zum View: Wurde der
DataViewmit einem eigenenbyteOffsetangelegt, zählt der Offset ab dessen Anfang und nicht ab dem Buffer-Anfang. Achtung beinew DataView(uint8Array.buffer): Das Typed Array kann auch nur einen Ausschnitt des Buffers abdecken. Nutze dannnew DataView(arr.buffer, arr.byteOffset, arr.byteLength). - Bei einem abgetrennten (detached) Buffer, z. B. nach
postMessagemit Transfer, wird einTypeErrorausgelöst. - Für signierte Werte (−32768 bis 32767) nimmst du
getInt16(). Das Gegenstück zum Schreiben istsetUint16(). - Kompatibilität: wird von allen modernen Browsern und von Node.js unterstützt.