Signatur
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
-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
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
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);
// Wichtig · Fallstricke
- Standard ist Big-Endian: Wer
littleEndianvergisst, erhält bei Little-Endian-Daten falsche Werte – der häufigste Fehler. - RangeError: Wird ausgelöst, wenn
byteOffset + 2größer alsbyteLengthdes Views ist oder der Offset negativ ist. Beim Lesen in Schleifen daheroffset + 2 <= view.byteLengthprüfen. - Der Offset bezieht sich auf den
DataView, nicht auf denArrayBuffer– beinew DataView(buffer, 10)liestgetInt16(0)ab Byte 10 des Buffers. - Ist der zugrunde liegende
ArrayBufferabgelöst (detached, z. B. nachpostMessagemit Transfer), wird einTypeErrorausgelöst. - Für große, ausgerichtete Datenmengen in nativer Byte-Reihenfolge ist ein
Int16Arraymeist schneller;DataViewist erste Wahl bei gemischten Formaten oder fester Byte-Reihenfolge. - Kompatibilität: in allen modernen Browsern und Node.js uneingeschränkt verfügbar.