Start · Sprachen · JavaScript · Referenz · DataView.prototype.getUint16()

DataView.prototype.getUint16()

Methode

Liest 2 Bytes ab <code>byteOffset</code> aus einem <code>DataView</code> und gibt sie als vorzeichenlose 16-Bit-Ganzzahl (0–65535) zurück.

seit JavaScript ES2015 (Baseline: alle Browser, Node.js 0.10+) Kategorie: method-property

Signatur

DataView.prototype.getUint16(byteOffset, littleEndian)

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

Typ
number
Beschreibung
Eine Ganzzahl von 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
1234 3412

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}`);
BM: 640x480

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 });
{ quellPort: 50000, zielPort: 443 }

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);
}
65535 -1 RangeError

// Wichtig · Fallstricke

  • Standard ist Big-Endian: Lässt du littleEndian weg, 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 byteOffset negativ ist oder byteOffset + 2 größer als byteLength des Views ist.
  • Offset relativ zum View: Wurde der DataView mit einem eigenen byteOffset angelegt, zählt der Offset ab dessen Anfang und nicht ab dem Buffer-Anfang. Achtung bei new DataView(uint8Array.buffer): Das Typed Array kann auch nur einen Ausschnitt des Buffers abdecken. Nutze dann new DataView(arr.buffer, arr.byteOffset, arr.byteLength).
  • Bei einem abgetrennten (detached) Buffer, z. B. nach postMessage mit Transfer, wird ein TypeError ausgelöst.
  • Für signierte Werte (−32768 bis 32767) nimmst du getInt16(). Das Gegenstück zum Schreiben ist setUint16().
  • Kompatibilität: wird von allen modernen Browsern und von Node.js unterstützt.