Signatur
Beschreibung
setUint16() speichert einen Wert als vorzeichenlose 16-Bit-Ganzzahl in den zugrunde liegenden ArrayBuffer. Anders als bei einem Uint16Array kannst du mit einem DataView an beliebigen Byte-Offsets schreiben (keine Ausrichtung auf 2 Bytes nötig) und die Byte-Reihenfolge (Endianness) selbst festlegen.
Typische Einsatzfälle sind binäre Dateiformate und Protokolle: Header von WAV-, BMP- oder PNG-Dateien, Portnummern in Netzwerkpaketen, Längenfelder in eigenen Binärprotokollen über WebSocket oder WebRTC, Bluetooth-Nachrichten (Web Bluetooth) oder das Befüllen von Puffern für WebGL.
Der Wert wird vor dem Schreiben per ToUint16 umgewandelt: Nachkommastellen werden abgeschnitten, und Werte außerhalb von 0–65535 werden modulo 216 umgebrochen – es gibt also keinen Fehler bei Überlauf. Standardmäßig wird Big-Endian geschrieben; für Little-Endian (z. B. bei den meisten Dateiformaten auf x86-Basis) musst du true als dritten Parameter übergeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $byteOffset Pflicht | number | Offset in Bytes ab dem Beginn der Ansicht, an dem geschrieben wird. Muss so gewählt sein, dass byteOffset + 2 <= byteLength gilt. |
|
| $value Pflicht | number | Zu schreibender Wert. Wird per ToUint16 in eine Ganzzahl von 0 bis 65535 umgewandelt (Überlauf modulo 65536). |
|
| $littleEndian | boolean | false | true schreibt Little-Endian (niederwertiges Byte zuerst), false bzw. weggelassen schreibt Big-Endian. |
Rückgabewert
Beispiele
Grundlagen: Big- vs. Little-Endian
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setUint16(0, 0x1234); // Big-Endian (Standard)
view.setUint16(2, 0x1234, true); // Little-Endian
console.log([...new Uint8Array(buffer)].map((b) => b.toString(16)));
console.log(view.getUint16(2, true));
Überlauf und Nachkommastellen
const view = new DataView(new ArrayBuffer(2));
for (const v of [65535, 65536, 70000, -1, 42.9]) {
view.setUint16(0, v);
console.log(v, '->', view.getUint16(0));
}
Praxis: WAV-Header-Felder schreiben (Little-Endian)
const createFmtChunk = ({ channels, sampleRate, bitsPerSample }) => {
const view = new DataView(new ArrayBuffer(24));
const blockAlign = channels * (bitsPerSample / 8);
// 'fmt ' als ASCII
[...'fmt '].forEach((c, i) => view.setUint8(i, c.charCodeAt(0)));
view.setUint32(4, 16, true); // Chunk-Größe
view.setUint16(8, 1, true); // Audioformat: PCM
view.setUint16(10, channels, true); // Kanäle
view.setUint32(12, sampleRate, true); // Abtastrate
view.setUint32(16, sampleRate * blockAlign, true);// Byterate
view.setUint16(20, blockAlign, true); // Block-Ausrichtung
view.setUint16(22, bitsPerSample, true); // Bits pro Sample
return view;
};
const fmt = createFmtChunk({ channels: 2, sampleRate: 44100, bitsPerSample: 16 });
console.log(fmt.getUint16(10, true), fmt.getUint16(20, true));
Praxis: Längenpräfix für ein Binärprotokoll
const encodeMessage = (text) => {
const payload = new TextEncoder().encode(text);
if (payload.length > 0xffff) throw new RangeError('Nachricht zu lang');
const out = new Uint8Array(2 + payload.length);
new DataView(out.buffer).setUint16(0, payload.length); // Network Byte Order
out.set(payload, 2);
return out;
};
console.log(encodeMessage('Hallo'));
// Wichtig · Fallstricke
- Standard ist Big-Endian: Wer den dritten Parameter vergisst, schreibt Big-Endian – ein häufiger Fehler bei Formaten wie WAV oder BMP, die Little-Endian erwarten. Netzwerkprotokolle („Network Byte Order“) sind dagegen meist Big-Endian.
- Kein Überlauffehler: Werte außerhalb von 0–65535 werden stillschweigend umgebrochen (
65536→0,-1→65535).NaNundInfinitywerden zu0. Bereiche daher vorher selbst prüfen. - RangeError: Wird geworfen, wenn
byteOffsetnegativ ist oderbyteOffset + 2über das Ende der Ansicht hinausgeht. Der Offset ist relativ zumbyteOffsetdesDataView, nicht zum Beginn desArrayBuffer. - TypeError: Bei einem abgetrennten (detached, z. B. per
postMessageübertragenen) Puffer. - Ein
BigIntalsvalueführt zu einemTypeError; für 64-Bit-Werte gibt essetBigUint64(). - Für große, gleichförmige Datenmengen in Plattform-Byte-Reihenfolge ist ein
Uint16Arrayin der Regel schneller. - Unterstützt in allen modernen Browsern und Node.js; funktioniert auch mit
SharedArrayBufferund größenveränderlichenArrayBuffers (ES2024).