Start · Sprachen · JavaScript · Referenz · new DataView()

new DataView()

Methode

Erzeugt eine <code>DataView</code>, mit der sich Binärdaten eines <code>ArrayBuffer</code> oder <code>SharedArrayBuffer</code> byte-genau und mit wählbarer Byte-Reihenfolge lesen und schreiben lassen.

seit JavaScript ES2015 Kategorie: method-property

Signatur

new DataView(buffer, byteOffset, byteLength)

Beschreibung

Der Konstruktor DataView() legt eine Sicht auf einen vorhandenen ArrayBuffer oder SharedArrayBuffer an. Anders als typisierte Arrays wie Uint8Array oder Float32Array ist eine DataView nicht auf einen einzelnen Elementtyp festgelegt. Mit Methoden wie getUint16(), setFloat32() oder getBigInt64() lassen sich an jedem beliebigen Byte-Offset unterschiedliche Zahlentypen lesen und schreiben.

Der größte Vorteil ist die ausdrückliche Wahl der Byte-Reihenfolge (Endianness). Typisierte Arrays verwenden immer die Byte-Reihenfolge der jeweiligen Plattform, in der Praxis fast immer Little-Endian. Bei DataView gibst du dagegen bei jedem Zugriff an, ob Big-Endian (Standard) oder Little-Endian gilt. Deshalb eignet sich DataView besonders zum Auslesen von Dateiformaten (WAV, PNG, BMP, ZIP), Netzwerkprotokollen und Binärnachrichten aus WebSockets oder fetch().

Die DataView kopiert keine Daten, sondern verweist auf denselben Speicher. Änderungen über die DataView sind also sofort in allen anderen Sichten auf denselben Puffer sichtbar. Mit byteOffset und byteLength lässt sich die Sicht auf einen Ausschnitt des Puffers begrenzen, etwa auf den Header einer Datei.

Der Konstruktor muss mit new aufgerufen werden. Ein Aufruf als normale Funktion wirft einen TypeError.

Parameter

Name Typ Default Beschreibung
$buffer Pflicht ArrayBuffer | SharedArrayBuffer Der Puffer, auf dem die Sicht arbeitet. Ein typisiertes Array ist hier nicht erlaubt. Verwende stattdessen typedArray.buffer.
$byteOffset number 0 Byte-Position im Puffer, an der die Sicht beginnt. Liegt der Wert außerhalb des Puffers, wird ein RangeError geworfen.
$byteLength number buffer.byteLength - byteOffset Länge der Sicht in Bytes. Fehlt der Wert, reicht die Sicht bis zum Ende des Puffers. Bei einem größenveränderbaren Puffer wächst sie dann automatisch mit. Ragt byteOffset + byteLength über das Pufferende hinaus, wird ein RangeError geworfen.

Rückgabewert

Typ
DataView
Beschreibung
Ein neues DataView-Objekt für den angegebenen Bereich des Puffers.

Beispiele

DataView erzeugen und Werte mit Endianness schreiben

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

// 16-Bit-Wert als Big-Endian (Standard) schreiben
view.setUint16(0, 0x1234);
// 32-Bit-Wert als Little-Endian schreiben
view.setUint32(2, 0xdeadbeef, true);

console.log(new Uint8Array(buffer));
console.log(view.getUint16(0).toString(16));
console.log(view.getUint32(2, true).toString(16));
Uint8Array(8) [18, 52, 239, 190, 173, 222, 0, 0] 1234 deadbeef

Ausschnitt eines Puffers mit byteOffset und byteLength

const buffer = new ArrayBuffer(16);
// Sicht nur auf die Bytes 4 bis 11
const view = new DataView(buffer, 4, 8);

view.setFloat64(0, Math.PI);

console.log(view.byteOffset, view.byteLength);
// Derselbe Speicher über eine zweite Sicht
console.log(new DataView(buffer).getFloat64(4));
4 8 3.141592653589793

WAV-Header aus einer heruntergeladenen Datei lesen

const readWavInfo = async (url) => {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();
  const view = new DataView(buffer, 0, 44); // Standard-WAV-Header

  const text = (offset, length) =>
    String.fromCharCode(...new Uint8Array(buffer, offset, length));

  if (text(0, 4) !== 'RIFF' || text(8, 4) !== 'WAVE') {
    throw new Error('Keine gültige WAV-Datei');
  }

  // WAV speichert Zahlen als Little-Endian
  return {
    kanaele: view.getUint16(22, true),
    abtastrate: view.getUint32(24, true),
    bitsProSample: view.getUint16(34, true)
  };
};

readWavInfo('/audio/beispiel.wav').then(console.log);
{ kanaele: 2, abtastrate: 44100, bitsProSample: 16 }

DataView auf ein vorhandenes typisiertes Array

const bytes = new Uint8Array([0x00, 0x00, 0x80, 0x3f, 0xff]);

// Nicht bytes selbst übergeben, sondern dessen Puffer mit Offset und Länge
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);

console.log(view.getFloat32(0, true));
1

// Wichtig · Fallstricke

  • Standard ist Big-Endian: Ohne littleEndian = true lesen und schreiben alle get…- und set…-Methoden in Big-Endian-Reihenfolge. Typisierte Arrays arbeiten dagegen fast immer in Little-Endian. Werden beide gemischt, entstehen leicht vertauschte Bytes.
  • Nur Puffer als erstes Argument: new DataView(new Uint8Array(4)) wirft einen TypeError. Übergib typedArray.buffer zusammen mit byteOffset und byteLength. Das gilt auch für Node.js-Buffer, die sich oft einen größeren gemeinsamen Speicherbereich teilen.
  • RangeError: Wenn Offset oder Länge über den Puffer hinausgehen, wirft schon der Konstruktor einen Fehler. Dasselbe gilt für jeden späteren Zugriff außerhalb der Sicht.
  • Abgetrennte Puffer: Wird der Puffer abgetrennt (detached), etwa durch postMessage mit Übertragungsliste oder durch ArrayBuffer.prototype.transfer(), wirft jeder weitere Zugriff einen TypeError.
  • Größenveränderbare Puffer (ES2024): Ohne byteLength wächst die Sicht mit einem größenveränderbaren ArrayBuffer automatisch mit.
  • Kompatibilität: DataView wird in allen modernen Browsern und in Node.js unterstützt. getBigInt64() und setBigInt64() gibt es erst seit ES2020. getFloat16() ist sehr neu und noch nicht überall verfügbar.
  • Leistung: Für große, einheitliche Datenmengen sind typisierte Arrays meist schneller. DataView spielt seine Stärken bei gemischten Strukturen und festgelegter Byte-Reihenfolge aus.