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).