javascript ArrayBuffer, pentru ce este? (Programare, Javascript)

mkoryak a intrebat.

Poate că este târziu, sau poate că este sake, dar tocmai am citit documentația pentru ArrayBuffer și nu mă pot gândi la un singur lucru pentru care ar fi cu adevărat util.

Poate cineva să mă lumineze?

Există vreo utilizare la care se poate gândi cineva care nu implică imagini?

Comentarii

  • Hmmm, se pare că node.js ar fi încântat de acest lucru pentru codul de nivel scăzut legat de IO. –  > Por Corbin.
  • Din memoria inconștientă îmi amintesc că astfel de lucruri sunt folosite pentru a păstra date binare (cum ar fi datele binare ale unei imagini) pentru a le manipula și a le stoca/trimite. În plus, dacă lucrezi la un program de aplicație, atunci poți ști că bufferele sunt foarte utile. Iar HTML 5 a trecut acum dincolo de programarea web…. –  > Por Imdad.
  • Cred că @Imdad are dreptate. Contextul HTML5 canvas are o metodă getImageData care returnează multe proprietăți ale imaginii desenate, inclusiv una numită buffer de tip ArrayBuffer –  > Por Danilo Valente.
  • O mică utilizare este descrisă @ developer.mozilla.org/en/JavaScript_typed_arrays –  > Por Imdad.
3 răspunsuri
Imdad

Practic, ArrayBuffer este folosit pentru a păstra date binare. Pot fi datele binare ale unei imagini, de exemplu.

În alte limbaje, tampoanele se dovedesc a fi foarte utile. Da, desigur, este puțin mai dificil de înțeles/utilizat decât alte tipuri de date.

ArrayBuffer poate fi utilizat pentru a obține datele unei imagini jpg (octeți RGB) și pentru a produce un png din acestea prin adăugarea octetului alfa (adică RGBA).

Site-ul Mozilla a prezentat o mică utilizare a ArrayBuffer aici

Lucrul cu structuri de date complexe

Prin combinarea unui singur buffer cu mai multe vizualizări de diferite tipuri, care încep la diferite distanțe în buffer, puteți interacționa cu obiecte de date care conțin mai multe tipuri de date. Acest lucru vă permite, de exemplu, să interacționați cu structuri de date complexe din WebGL, , fișiere de date sau structuri C pe care trebuie să le utilizați în timp ce folosiți js-ctypes.

Luați în considerare această structură C:

struct someStruct {  
  unsigned long id;  
  char username[16];  
  float amountDue;  
};  

Puteți accesa un buffer care conține date în acest format în felul următor:

var buffer = new ArrayBuffer(24);  

// ... read the data into the buffer ...  

var idView = new Uint32Array(buffer, 0, 1);  
var usernameView = new Uint8Array(buffer, 4, 16);  
var amountDueView = new Float32Array(buffer, 20, 1);  

Apoi, puteți accesa, de exemplu, suma datorată cu amountDueView[0].

Notă: La alinierea structurii de date într-o structură C depinde de platformă. Luați măsuri de precauție și luați în considerare aceste diferențe de capitonare.

Comentarii

  • Deci, se poate presupune că un ArrayBuffer nu este necesar dacă știți deja că lucrați, de exemplu, cu date pure de 8 biți fără semn, ați putea la fel de bine să creați un Uint8Array și să îl umpleți? Cum rămâne cu Blob și FileReader – acestea par să funcționeze cu ArrayBuffer? Cel puțin așa lucrez eu în mod normal cu fișiere binare în javascript. –  > Por Johncl.
  • Consultați linkul developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays –  > Por Imdad.
  • Idview ar trebui să ia 4 octeți, nu 1 –  > Por Royi Namir.
  • ideea este că parametrul lungime este numărul de elemente, nu de octeți, judecând după exemplu. încercați. new Int32Array(Uint8Array.from([1,2,3,4]).buffer,0,1) să o testați. –  > Por aiodintsov.
  • Acest lucru chiar nu adaugă prea multe la răspuns în afară de a oferi un copy-paste de pe site-ul Mozilla. –  > Por Vix.
Jonathan

În afară de imagini, este util pentru construirea și destructurarea precisă a pachetelor de date de rețea de nivel scăzut utilizate în protocoale precum UDP.

Dull Bananas

Un ArrayBuffer reprezintă date binare în memoria RAM. Puteți „deschide” un ArrayBuffer pentru citire și scriere folosind fie un array tipizat, fie un DataView.

Tablouri tipizate, , cum ar fi Uint16Array, , pot citi și scrie tamponul tratându-l ca pe o singură matrice de numere întregi. Acestea nu vă permit să controlați endianness; utilizează endianness-ul nativ al platformei. Utilizarea Uint8Array este utilă pentru a controla octeți individuali (acest lucru nu este afectat de endianness).

DataView nu este la fel de simplu, dar vă oferă mult mai mult control. Vă oferă un control total asupra endianness-ului, a dimensiunii numerelor întregi și a indexului de octeți (de exemplu, puteți accesa un număr întreg de 32 de biți la un index chiar dacă acesta nu este divizibil pe 32 de biți). Aceste lucruri pot fi alese de fiecare dată când citiți și scrieți un număr întreg cu același DataView.

Acest lucru poate fi util: https://javascript.info/arraybuffer-binary-arrays