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

DataView.prototype.getInt16()

Methode

Liest 2 Bytes ab <code>byteOffset</code> eines <code>DataView</code> und interpretiert sie als vorzeichenbehaftete 16-Bit-Ganzzahl (−32768 bis 32767).

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

Signatur

DataView.prototype.getInt16(byteOffset, littleEndian)

Beschreibung

getInt16() liest zwei aufeinanderfolgende Bytes aus dem zugrunde liegenden ArrayBuffer ab dem angegebenen Byte-Offset (relativ zum Beginn des DataView) und gibt sie als 16-Bit-Ganzzahl im Zweierkomplement zurück. Der Wertebereich reicht von -32768 bis 32767.

Die Methode wird vor allem beim Parsen binärer Formate eingesetzt: WAV-Audiodaten (16-Bit-PCM-Samples), Netzwerkprotokolle, Sensordaten, Spieledateien oder Header von Bild- und Archivformaten. Anders als ein Int16Array erlaubt DataView unausgerichtete Zugriffe (beliebige Offsets, auch ungerade) und eine explizite Wahl der Byte-Reihenfolge.

Wichtig ist der Parameter littleEndian: Wird er weggelassen, liest getInt16() im Big-Endian-Format (Netzwerk-Byte-Reihenfolge). Viele Dateiformate (z. B. WAV, BMP) und nahezu alle heutigen CPUs verwenden jedoch Little-Endian – dann muss true übergeben werden.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Offset in Bytes ab dem Anfang des DataView, ab dem gelesen wird. Wird per ToIndex in eine ganze Zahl umgewandelt; negative Werte lösen einen RangeError aus.
$littleEndian boolean false Gibt an, ob die Bytes im Little-Endian-Format gelesen werden. Bei false oder undefined wird Big-Endian verwendet.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl von -32768 bis 32767.

Beispiele

Grundlagen: Big- vs. Little-Endian

const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);

// Bytes 0xFF 0x38 schreiben
view.setUint8(0, 0xff);
view.setUint8(1, 0x38);

console.log(view.getInt16(0));        // Big-Endian: 0xFF38
console.log(view.getInt16(0, true));  // Little-Endian: 0x38FF
-200 14591

Negative Werte schreiben und lesen

const view = new DataView(new ArrayBuffer(2));

view.setInt16(0, -12345, true);
console.log(view.getInt16(0, true));   // korrekt mit Vorzeichen
console.log(view.getUint16(0, true));  // gleiche Bytes ohne Vorzeichen
-12345 53191

16-Bit-PCM-Samples aus einer WAV-Datei lesen

const readPcmSamples = async (url) => {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();
  const view = new DataView(buffer);

  const dataStart = 44; // Standard-WAV-Header-Länge
  const samples = [];
  for (let offset = dataStart; offset + 2 <= view.byteLength; offset += 2) {
    // WAV speichert Little-Endian; auf -1..1 normalisieren
    samples.push(view.getInt16(offset, true) / 32768);
  }
  return samples;
};

readPcmSamples('/audio/beep.wav').then((s) => console.log(s.length, s.slice(0, 3)));

Unausgerichteter Zugriff in einem Protokoll-Paket

// Paket: [Typ: 1 Byte][Temperatur ×100: Int16 BE]
const packet = new Uint8Array([0x01, 0xf6, 0x3c]);
const view = new DataView(packet.buffer);

const type = view.getUint8(0);
const temp = view.getInt16(1) / 100; // Offset 1 – mit Int16Array nicht möglich
console.log(type, temp);
1 -25.8

// Wichtig · Fallstricke

  • Standard ist Big-Endian: Wer littleEndian vergisst, erhält bei Little-Endian-Daten falsche Werte – der häufigste Fehler.
  • RangeError: Wird ausgelöst, wenn byteOffset + 2 größer als byteLength des Views ist oder der Offset negativ ist. Beim Lesen in Schleifen daher offset + 2 <= view.byteLength prüfen.
  • Der Offset bezieht sich auf den DataView, nicht auf den ArrayBuffer – bei new DataView(buffer, 10) liest getInt16(0) ab Byte 10 des Buffers.
  • Ist der zugrunde liegende ArrayBuffer abgelöst (detached, z. B. nach postMessage mit Transfer), wird ein TypeError ausgelöst.
  • Für große, ausgerichtete Datenmengen in nativer Byte-Reihenfolge ist ein Int16Array meist schneller; DataView ist erste Wahl bei gemischten Formaten oder fester Byte-Reihenfolge.
  • Kompatibilität: in allen modernen Browsern und Node.js uneingeschränkt verfügbar.