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

DataView.prototype.getInt32()

Methode

Liest 4 Bytes ab <code>byteOffset</code> aus einem <code>DataView</code> und gibt sie als vorzeichenbehaftete 32-Bit-Ganzzahl zurück.

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

Signatur

DataView.prototype.getInt32(byteOffset, littleEndian)

Beschreibung

getInt32() liest vier aufeinanderfolgende Bytes ab dem angegebenen Byte-Offset des zugrunde liegenden ArrayBuffer und interpretiert sie als 32-Bit-Ganzzahl mit Vorzeichen im Zweierkomplement. Der Wertebereich reicht von -2147483648 bis 2147483647.

Die Methode kommt vor allem beim Parsen binärer Formate zum Einsatz: Dateiköpfe (BMP, WAV, ZIP), Netzwerkprotokolle, WebSocket-Binärnachrichten oder WebAssembly-Speicher. Anders als ein Int32Array muss der Offset nicht an 4 Bytes ausgerichtet sein, und die Bytereihenfolge (Endianness) lässt sich pro Aufruf explizit festlegen – unabhängig von der Plattform.

Standardmäßig wird Big-Endian gelesen (Netzwerk-Bytereihenfolge). Viele Dateiformate und praktisch alle aktuellen CPUs verwenden jedoch Little-Endian – dann muss littleEndian auf true gesetzt werden. Ein vergessenes true ist die häufigste Fehlerquelle.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Offset in Bytes relativ zum Beginn des DataView (nicht des Buffers), ab dem gelesen wird. Wird in eine Ganzzahl umgewandelt.
$littleEndian boolean false true liest im Little-Endian-Format, false oder weggelassen im Big-Endian-Format.

Rückgabewert

Typ
number
Beschreibung
Eine Ganzzahl zwischen -2147483648 und 2147483647 (inklusive).

Beispiele

Big- und Little-Endian im Vergleich

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

// Bytes 0xFF 0xFF 0xFF 0x85 schreiben
view.setUint8(0, 0xff);
view.setUint8(1, 0xff);
view.setUint8(2, 0xff);
view.setUint8(3, 0x85);

console.log(view.getInt32(0));       // Big-Endian (Standard)
console.log(view.getInt32(0, true)); // Little-Endian
-123 -2046820353

Breite und Höhe aus einem BMP-Header lesen

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

  // BMP ist Little-Endian; Höhe kann negativ sein (Top-down-Bitmap)
  const width = view.getInt32(18, true);
  const height = view.getInt32(22, true);
  return { width, height: Math.abs(height), topDown: height < 0 };
};

readBmpSize('/bilder/logo.bmp').then(console.log);
{ width: 256, height: 128, topDown: true }

Nicht ausgerichteter Zugriff und Offset relativ zur View

const buffer = new ArrayBuffer(12);
const full = new DataView(buffer);
full.setInt32(5, -42_000, true); // Offset 5 – nicht durch 4 teilbar

// View beginnt bei Byte 4 – Offset 1 entspricht Byte 5 im Buffer
const sub = new DataView(buffer, 4, 8);
console.log(sub.getInt32(1, true));
-42000

Fehler bei Zugriff außerhalb der Grenzen abfangen

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

try {
  view.getInt32(3); // bräuchte Bytes 3–6, aber nur 0–5 existieren
} catch (err) {
  console.log(err.name, '-', err.message);
}
RangeError - Offset is outside the bounds of the DataView

// Wichtig · Fallstricke

  • Endianness: Standard ist Big-Endian. Für die meisten Dateiformate (BMP, WAV, ZIP) und WebAssembly-Speicher muss littleEndian auf true gesetzt werden.
  • RangeError: Wird ausgelöst, wenn byteOffset + 4 größer als byteLength der View ist oder der Offset negativ ist. Bei einem abgelösten (transferierten) Buffer gibt es einen TypeError.
  • Vorzeichen: Werte ab 0x80000000 werden negativ. Für vorzeichenlose Werte getUint32() verwenden, für 64-Bit-Werte getBigInt64().
  • Der Offset ist relativ zum Beginn der View, nicht zum Beginn des ArrayBuffer.
  • Kompatibilität: in allen modernen Browsern und Node.js verfügbar; funktioniert auch mit SharedArrayBuffer (dort aber nicht atomar – für Thread-Sicherheit Atomics nutzen).