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

DataView.prototype.getUint32()

Methode

Liest 4 Bytes ab <code>byteOffset</code> und gibt sie als vorzeichenlose 32-Bit-Ganzzahl (0 bis 4294967295) zurück, wahlweise in Big- oder Little-Endian.

seit JavaScript ES2015 (Baseline: alle Browser) Kategorie: method-property

Signatur

DataView.prototype.getUint32(byteOffset, littleEndian)

Beschreibung

getUint32() liest vier aufeinanderfolgende Bytes aus dem ArrayBuffer hinter einer DataView und setzt sie zu einer vorzeichenlosen 32-Bit-Ganzzahl zusammen. Der Wertebereich reicht von 0 bis 4294967295 (232 − 1). Das Ergebnis ist ein normales number, kein BigInt.

Die Methode braucht man vor allem zum Parsen binärer Formate: Dateiköpfe (PNG, ZIP, WAV, BMP), Netzwerkprotokolle, WebSocket-Binärnachrichten oder WebAssembly-Speicher. Im Gegensatz zu einem Uint32Array muss der Offset nicht an einer 4-Byte-Grenze liegen, und die Byte-Reihenfolge lässt sich pro Aufruf festlegen.

Standardmäßig wird Big-Endian gelesen (Netzwerk-Byte-Reihenfolge). Für Little-Endian-Formate, etwa die meisten Dateiformate unter Windows oder den Speicher von x86/ARM-Rechnern, muss littleEndian ausdrücklich auf true gesetzt werden.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Position in Bytes ab dem Beginn der View, ab der gelesen wird. Wird in eine Ganzzahl umgewandelt; muss zwischen 0 und byteLength - 4 liegen.
$littleEndian boolean false Bei true wird Little-Endian gelesen, bei false oder fehlendem Wert Big-Endian.

Rückgabewert

Typ
number
Beschreibung
Eine Ganzzahl von 0 bis 4294967295.

Beispiele

Grundlagen: Big- und Little-Endian

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

// Bytes 0x12 0x34 0x56 0x78 schreiben
[0x12, 0x34, 0x56, 0x78].forEach((b, i) => view.setUint8(i, b));

console.log(view.getUint32(0).toString(16));       // Big-Endian (Standard)
console.log(view.getUint32(0, true).toString(16)); // Little-Endian
12345678 78563412

Kein Vorzeichen – Unterschied zu getInt32()

const view = new DataView(new ArrayBuffer(4));
view.setUint32(0, 0xFFFFFFFF);

console.log(view.getUint32(0)); // vorzeichenlos
console.log(view.getInt32(0));  // vorzeichenbehaftet
4294967295 -1

PNG-Breite und -Höhe aus dem IHDR-Chunk lesen

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

  // PNG-Signatur prüfen: 0x89 'P' 'N' 'G'
  if (view.getUint32(0) !== 0x89504E47) {
    throw new Error('Keine PNG-Datei');
  }
  // IHDR beginnt bei Offset 8; Breite/Höhe liegen bei 16 und 20 (Big-Endian)
  return {
    width: view.getUint32(16),
    height: view.getUint32(20)
  };
};

getPngSize('/bilder/logo.png').then(console.log);
{ width: 512, height: 256 }

Nicht ausgerichteter Zugriff in einer WAV-Datei (Little-Endian)

const readWavHeader = (buffer) => {
  const view = new DataView(buffer);
  return {
    fileSize: view.getUint32(4, true) + 8, // RIFF-Chunkgröße
    sampleRate: view.getUint32(24, true),
    byteRate: view.getUint32(28, true)
  };
};

// Beispiel: Datei aus einem <input type="file">
document.querySelector('#wav').addEventListener('change', async (e) => {
  const buffer = await e.target.files[0].arrayBuffer();
  console.log(readWavHeader(buffer));
});
{ fileSize: 1764044, sampleRate: 44100, byteRate: 176400 }

// Wichtig · Fallstricke

  • Byte-Reihenfolge: Standard ist Big-Endian. Bei Little-Endian-Formaten wird true oft vergessen, was zu völlig falschen Werten führt, aber keinen Fehler auslöst.
  • RangeError: Wird ausgelöst, wenn byteOffset negativ ist oder byteOffset + 4 über das Ende der View hinausgeht. Der Offset zählt ab byteOffset der View, nicht ab dem Anfang des zugrunde liegenden Buffers.
  • TypeError: Wird ausgelöst, wenn der ArrayBuffer abgekoppelt ist (zum Beispiel nach postMessage mit Transfer oder nach buffer.transfer()).
  • Das Ergebnis ist immer ein number. Bitoperatoren wie | oder & wandeln Werte ≥ 231 in negative Int32-Werte um. Mit >>> 0 bleibt der Wert vorzeichenlos.
  • Für 64-Bit-Werte gibt es getBigUint64(). Wenn viele gleichartige, ausgerichtete Werte in nativer Byte-Reihenfolge vorliegen, ist ein Uint32Array meist schneller.
  • Wird in allen modernen Browsern, in Node.js und in Deno unterstützt.