Cum să împachetezi elementele unui array JavaScript într-un buffer de octeți și să creezi un nou array numeric din buffer

  • 2 minute de citit
  • 10 exemple de cod

Disponibil și în English

Pe această pagină

Salut 👋,

În acest articol scurt vorbim despre împachetarea numerelor întregi în date binare în JavaScript, folosind clasele Buffer, ArrayBuffer și DataView.

Uneori, în JavaScript, poate fi necesar să împachetezi elementele unui array într-un buffer de octeți și apoi să creezi un nou array numeric din conținutul buffer-ului. Acest lucru se poate realiza folosind obiectul DataView din JavaScript.

Mai întâi, creează un array cu elementele pe care vrei să le împachetezi, de exemplu:

let a = [5, 13];

Apoi, creează un ArrayBuffer nou de dimensiunea necesară:

let buffer = new ArrayBuffer(8);

Creează un obiect DataView folosind acest buffer:

let view = new DataView(buffer);

Parcurge fiecare element al array-ului original și folosește metoda setInt32 a obiectului DataView pentru a împacheta fiecare element în buffer:

for(let i = 0; i < a.length; i++) {  view.setInt32(i*4, a[i], false); // false for little-endian}

Observă că metoda setInt32 primește trei argumente:

  • Primul argument este offsetul, în octeți, la care se scrie valoarea.
  • Al doilea argument este valoarea de scris.
  • Al treilea argument este un boolean care indică dacă se folosește ordinea octeților little-endian sau big-endian.

Pentru a crea un nou array numeric din conținutul buffer-ului, creează un ArrayBuffer nou de aceeași dimensiune ca buffer-ul original:

let newBuffer = new ArrayBuffer(8);

Creează un nou obiect DataView folosind acest buffer:

let newView = new DataView(newBuffer);

Parcurge din nou fiecare element al array-ului original și folosește metoda getInt32 a obiectului DataView original pentru a obține valoarea fiecărui element din buffer-ul original. Apoi folosește metoda setInt32 a noului obiect DataView pentru a scrie aceeași valoare în noul buffer:

for (let i = 0; i < a.length; i++) {  let value = view.getInt32(i*4, false); // get value from original buffer  newView.setInt32(i*4, value, false); // set value in new buffer}

În final, creează un nou array numeric folosind noul buffer:

let newArray = new Int32Array(newBuffer);

Astfel vei obține un nou array numeric care conține aceleași valori ca array-ul original, împachetate într-un buffer de octeți.

O altă modalitate de a realiza această sarcină este să folosești scurtătura:

let bytes = new Uint8Array(buf.buffer)let int32Data = new Int32Array(bytes.buffer)

Mulțumesc că ai citit!

cod complet:

let a = [5, 13];let buffer = new ArrayBuffer(8);let view = new DataView(buffer);for(let i = 0; i < a.length; i++) {    view.setInt32(i*4, a[i], true); // false for little-endian}let newBuffer = new ArrayBuffer(8); // create new buffer of size 8let newView = new DataView(newBuffer);for (let i = 0; i < a.length; i++) {    let value = view.getInt32(i*4, true); // get value from original buffer    newView.setInt32(i*4, value, true); // set value in new buffer}let newArray = new Int32Array(newBuffer);console.log(newArray)