Signatur
Beschreibung
setUint32() speichert einen Zahlenwert als vorzeichenlosen 32-Bit-Integer in den vier Byte ab byteOffset des zugrunde liegenden ArrayBuffer. Im Gegensatz zu einem Uint32Array muss der Offset nicht an einer durch 4 teilbaren Stelle liegen, und die Byte-Reihenfolge (Endianness) lässt sich pro Aufruf festlegen.
Typische Einsatzgebiete sind binäre Dateiformate und Protokolle: Header von PNG-, WAV- oder ZIP-Dateien, Längenfelder in Netzwerkpaketen (WebSocket, WebRTC-Datenkanäle), Prüfsummen wie CRC32 oder IPv4-Adressen. Viele Netzwerkprotokolle verwenden Big-Endian („Network Byte Order“) – genau das ist der Standard von DataView, wenn littleEndian weggelassen wird.
Der übergebene Wert wird per ToUint32 umgewandelt: Nachkommastellen werden abgeschnitten, Werte außerhalb des Bereichs werden modulo 232 umgebrochen (z. B. wird -1 zu 4294967295), NaN und Infinity werden zu 0. Es gibt keinen Fehler bei Überlauf – nur bei ungültigem Offset.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $byteOffset Pflicht | number | Offset in Byte vom Beginn der Ansicht, ab dem geschrieben wird. Es müssen mindestens 4 Byte ab dieser Position innerhalb der Ansicht liegen. | |
| $value Pflicht | number | Der zu speichernde Wert. Wird per ToUint32 in den Bereich 0 bis 232−1 umgewandelt (Umbruch modulo 232). |
|
| $littleEndian | boolean | false | true speichert im Little-Endian-Format, false bzw. weggelassen im Big-Endian-Format. |
Beispiele
Grundlegend: Big- vs. Little-Endian
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setUint32(0, 0xDEADBEEF); // Big-Endian (Standard)
view.setUint32(4, 0xDEADBEEF, true); // Little-Endian
const hex = [...new Uint8Array(buffer)]
.map((b) => b.toString(16).padStart(2, '0'))
.join(' ');
console.log(hex);
console.log(view.getUint32(0), view.getUint32(4, true));
Längen-Präfix für ein Netzwerkpaket
const encodePacket = (text) => {
const payload = new TextEncoder().encode(text);
const buffer = new ArrayBuffer(4 + payload.byteLength);
const view = new DataView(buffer);
// Länge in Network Byte Order (Big-Endian) voranstellen
view.setUint32(0, payload.byteLength);
new Uint8Array(buffer, 4).set(payload);
return buffer;
};
const packet = encodePacket('Hallo Welt');
console.log(new DataView(packet).getUint32(0));
// z. B.: socket.send(packet);
IPv4-Adresse als 32-Bit-Zahl speichern
const ipToBytes = (ip) => {
const num = ip.split('.').reduce((acc, part) => acc * 256 + Number(part), 0);
const view = new DataView(new ArrayBuffer(4));
view.setUint32(0, num);
return new Uint8Array(view.buffer);
};
console.log(ipToBytes('192.168.1.10'));
Umbruch bei Werten außerhalb des Bereichs
const view = new DataView(new ArrayBuffer(4));
view.setUint32(0, -1);
console.log(view.getUint32(0));
view.setUint32(0, 2 ** 32 + 5);
console.log(view.getUint32(0));
view.setUint32(0, 3.99);
console.log(view.getUint32(0));
// Wichtig · Fallstricke
- Standard ist Big-Endian: Wer
littleEndianweglässt, schreibt Big-Endian – ein häufiger Fehler bei Formaten wie WAV, BMP oder ZIP, die Little-Endian verwenden. Beim Lesen mitgetUint32()muss dieselbe Byte-Reihenfolge angegeben werden. - RangeError: Wird geworfen, wenn
byteOffsetnegativ ist oderbyteOffset + 4über das Ende der Ansicht hinausgeht. EinTypeErrorentsteht bei einem abgelösten (detached) Puffer, etwa nach einer Übertragung perpostMessage. - Stiller Überlauf: Werte außerhalb von 0 bis 4.294.967.295 werden ohne Fehler modulo 232 umgebrochen. Eingaben ggf. vorher validieren.
- Bitoperationen wie
a | bliefern vorzeichenbehaftete 32-Bit-Ergebnisse; fürsetUint32()ist das unkritisch, beim Anzeigen hilftx >>> 0. - Für 64-Bit-Werte
setBigUint64()mitBigIntverwenden. - Kompatibilität: in allen modernen Browsern und Node.js verfügbar.