DataView în JavaScript

Date binare (ArrayBuffer, typed arrays) ES2015 (getFloat16/setFloat16: ES2025)

Citește și scrie numere de tipuri diferite la orice poziție dintr-un ArrayBuffer, cu ordinea octeților aleasă.

Sintaxă
new DataView(buffer, pozitie, lungime)
view.getUint16(pozitie, littleEndian)
view.setFloat32(pozitie, valoare, littleEndian)

Ce face DataView

Un typed array are un singur tip. Formatele de fișiere și protocoalele binare amestecă însă tipuri: un antet cu un număr pe 2 octeți, urmat de unul pe 4 octeți și de un număr cu zecimale. DataView citește și scrie orice tip la orice poziție în octeți.

Metodele sunt perechi get…/set… pentru fiecare tip: Int8, Uint8, Int16, Uint16, Int32, Uint32, Float16, Float32, Float64, BigInt64, BigUint64 (ultimele două lucrează cu BigInt).

Ultimul parametru, littleEndian, alege ordinea octeților. Implicit este false (big-endian, ordinea folosită în rețea). Fișierele Windows și majoritatea procesoarelor folosesc little-endian, deci acolo dai true.

Parametri

Parametru Descriere
pozitie Poziția în octeți, de la începutul vederii.
valoare Pentru metodele set: numărul scris.
littleEndian Opțional. true pentru little-endian. Implicit big-endian.

Ce returnează

Metodele get returnează numărul citit; metodele set returnează undefined.

Exemple

Exemplul 1: Un antet binar cu tipuri amestecate

const view = new DataView(new ArrayBuffer(11));

view.setUint16(0, 2026);
view.setInt32(2, -15);
view.setFloat32(6, 36.6);
view.setUint8(10, 255);

console.log(view.getUint16(0), view.getInt32(2), view.getFloat32(6).toFixed(1), view.getUint8(10));
console.log(new Uint8Array(view.buffer));

Rezultat

2026 -15 36.6 255
Uint8Array(11) [
    7, 234, 255, 255,
  255, 241,  66,  18,
  102, 102, 255
]

Exemplul 2: Ordinea octeților

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

view.setUint32(0, 0x01020304);
console.log(new Uint8Array(view.buffer));
view.setUint32(0, 0x01020304, true);
console.log(new Uint8Array(view.buffer));
console.log(view.getUint32(0).toString(16), view.getUint32(0, true).toString(16));

Rezultat

Uint8Array(4) [ 1, 2, 3, 4 ]
Uint8Array(4) [ 4, 3, 2, 1 ]
4030201 1020304

Exemplul 3: Numere pe 64 de biți

const view = new DataView(new ArrayBuffer(16));

view.setBigUint64(0, 2n ** 64n - 1n);
view.setFloat64(8, Math.PI, true);
console.log(view.getBigUint64(0), view.getBigInt64(0), view.getFloat64(8, true));

Rezultat

18446744073709551615n -1n 3.141592653589793

Greșeli frecvente

  • Scrii cu littleEndian și citești fără el (sau invers) și primești numere fără sens.
  • Citești dincolo de sfârșitul vederii și primești RangeError: Offset is outside the bounds of the DataView.

Comenzi înrudite

  • ArrayBuffer: Un bloc de memorie brută, de lungime dată în octeți; citit și scris prin typed arrays sau DataView.
  • Typed arrays (Uint8Array, Float64Array...): Tablouri de lungime fixă cu numere de un singur tip, pentru date binare: imagini, fișiere, audio, rețea.
  • BigInt.asIntN / asUintN: Taie un BigInt la un număr fix de biți, ca un întreg cu semn (asIntN) sau fără semn (asUintN).