Signatur
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
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
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));
});
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) });
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(' '));
// Wichtig · Fallstricke
- RangeError: Liegt
byteOffsetaußerhalb der View (negativ oder>= byteLength), wird einRangeErrorgeworfen – es wird nicht wie bei TypedArrays stillundefinedzurückgegeben. Vor dem Lesen daher die Länge prüfen. - Fehlender Parameter:
view.getUint8()ohne Argument liest Offset0(weilundefinedzu0wird). Das verdeckt leicht Programmierfehler. - Vorzeichen: Für Bytes mit Vorzeichen (−128 bis 127)
getInt8()verwenden. Dasselbe Byte0xFFergibt mitgetUint8()den Wert255, mitgetInt8()den Wert-1. - Abgelöste Buffer: Wurde der
ArrayBufferübertragen (z. B. viapostMessagemit Transfer-Liste) oder mittransfer()abgelöst, wirft der Zugriff einenTypeError. - Performance: Muss man sehr viele einzelne Bytes nacheinander lesen, ist ein
Uint8Arrayüber denselben Buffer meist schneller und bequemer;DataViewspielt seine Stärken bei gemischten Datentypen und Endianness aus. - Die Methode wird von allen modernen Browsern und von Node.js unterstützt.