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

DataView.prototype.getUint8()

Methode

Liest 1 Byte am angegebenen Byte-Offset eines <code>DataView</code> und gibt es als vorzeichenlose 8-Bit-Ganzzahl (0–255) zurück.

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

Signatur

DataView.prototype.getUint8(byteOffset)

Beschreibung

getUint8() liest genau ein Byte aus dem zugrunde liegenden ArrayBuffer (bzw. SharedArrayBuffer) eines DataView und interpretiert es als vorzeichenlose 8-Bit-Ganzzahl. Das Ergebnis liegt immer im Bereich 0 bis 255.

Die Methode braucht man beim Parsen von Binärformaten: Dateiköpfe (Magic Numbers von PNG, ZIP, WAV), Netzwerkprotokolle, Flag-Bytes, Versionsnummern oder Längenfelder mit einem Byte. Anders als die Mehrbyte-Methoden wie getUint16() oder getUint32() hat getUint8() keinen littleEndian-Parameter, denn bei einem einzelnen Byte spielt die Byte-Reihenfolge keine Rolle.

Der Offset bezieht sich immer auf den Anfang des DataView (nicht des Buffers). Hat man den DataView mit byteOffset angelegt, ist Index 0 also das erste Byte dieses Ausschnitts. Eine Ausrichtung (Alignment) ist nicht nötig.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Position in Bytes, ab dem Anfang der View gezählt, von der gelesen wird. Wird in eine Ganzzahl umgewandelt; muss zwischen 0 und byteLength - 1 liegen.

Rückgabewert

Typ
number
Beschreibung
Eine Ganzzahl zwischen 0 und 255 (inklusive).

Beispiele

Einfaches Schreiben und Lesen eines Bytes

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

view.setUint8(0, 200);
view.setUint8(1, 300); // wird modulo 256 gespeichert → 44
view.setInt8(2, -1);   // Bitmuster 0xFF

console.log(view.getUint8(0));
console.log(view.getUint8(1));
console.log(view.getUint8(2)); // gleiches Byte, aber vorzeichenlos gelesen
200 44 255

PNG-Signatur einer Datei prüfen

const isPng = async (file) => {
  const buffer = await file.slice(0, 8).arrayBuffer();
  if (buffer.byteLength < 8) return false;
  const view = new DataView(buffer);
  const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
  return signature.every((byte, i) => view.getUint8(i) === byte);
};

// Nutzung mit einem <input type="file">
document.querySelector('input[type=file]')
  .addEventListener('change', async (e) => {
    const file = e.target.files[0];
    console.log(`${file.name} ist PNG:`, await isPng(file));
  });
bild.png ist PNG: true

Header eines Binärprotokolls parsen (Version, Flags, Länge)

// Aufbau: [Version:1][Flags:1][Länge:1][Nutzdaten...]
const bytes = new Uint8Array([2, 0b00000101, 3, 72, 105, 33]);
const view = new DataView(bytes.buffer);

const version = view.getUint8(0);
const flags = view.getUint8(1);
const length = view.getUint8(2);

const compressed = (flags & 0b001) !== 0;
const encrypted  = (flags & 0b100) !== 0;

const payload = Array.from({ length }, (_, i) => view.getUint8(3 + i));
console.log({ version, compressed, encrypted, text: String.fromCharCode(...payload) });
{ version: 2, compressed: true, encrypted: true, text: 'Hi!' }

Hexdump eines Ausschnitts mit View-Offset

const buffer = new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe]).buffer;
// View beginnt bei Byte 2 und umfasst 3 Bytes
const view = new DataView(buffer, 2, 3);

const hex = [];
for (let i = 0; i < view.byteLength; i++) {
  hex.push(view.getUint8(i).toString(16).padStart(2, '0'));
}
console.log(hex.join(' '));
be ef ca

// Wichtig · Fallstricke

  • RangeError: Liegt byteOffset außerhalb der View (negativ oder >= byteLength), wird ein RangeError geworfen – es wird nicht wie bei TypedArrays still undefined zurückgegeben. Vor dem Lesen daher die Länge prüfen.
  • Fehlender Parameter: view.getUint8() ohne Argument liest Offset 0 (weil undefined zu 0 wird). Das verdeckt leicht Programmierfehler.
  • Vorzeichen: Für Bytes mit Vorzeichen (−128 bis 127) getInt8() verwenden. Dasselbe Byte 0xFF ergibt mit getUint8() den Wert 255, mit getInt8() den Wert -1.
  • Abgelöste Buffer: Wurde der ArrayBuffer übertragen (z. B. via postMessage mit Transfer-Liste) oder mit transfer() abgelöst, wirft der Zugriff einen TypeError.
  • Performance: Muss man sehr viele einzelne Bytes nacheinander lesen, ist ein Uint8Array über denselben Buffer meist schneller und bequemer; DataView spielt seine Stärken bei gemischten Datentypen und Endianness aus.
  • Die Methode wird von allen modernen Browsern und von Node.js unterstützt.