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

DataView.prototype.setUint32()

Methode

Schreibt eine Zahl als vorzeichenlose 32-Bit-Ganzzahl (0 bis 4.294.967.295) in 4 Byte ab dem angegebenen Byte-Offset eines <code>DataView</code>.

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

Signatur

DataView.prototype.setUint32(byteOffset, value, littleEndian)

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));
de ad be ef ef be ad de 3735928559 3735928559

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);
10

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'));
Uint8Array(4) [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));
4294967295 5 3

// Wichtig · Fallstricke

  • Standard ist Big-Endian: Wer littleEndian weglässt, schreibt Big-Endian – ein häufiger Fehler bei Formaten wie WAV, BMP oder ZIP, die Little-Endian verwenden. Beim Lesen mit getUint32() muss dieselbe Byte-Reihenfolge angegeben werden.
  • RangeError: Wird geworfen, wenn byteOffset negativ ist oder byteOffset + 4 über das Ende der Ansicht hinausgeht. Ein TypeError entsteht bei einem abgelösten (detached) Puffer, etwa nach einer Übertragung per postMessage.
  • 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 | b liefern vorzeichenbehaftete 32-Bit-Ergebnisse; für setUint32() ist das unkritisch, beim Anzeigen hilft x >>> 0.
  • Für 64-Bit-Werte setBigUint64() mit BigInt verwenden.
  • Kompatibilität: in allen modernen Browsern und Node.js verfügbar.