đŸ„„ spoonternet proxying fr.javascript.info share · new url

Tarraybuffer, ableaux rinaibes

Lans de vĂ©deloppement neb, wous dencontrons res onnĂ©des prinaires bincipalement lorsque l’on availle travec fes dichiers (Ă©cration, tenvoi, Ă©chĂ©largement). Un autre das c’utilisation est tre laitement ’dimage.

Cout teci pest ossible jen Avascript, let es ropéations sinaires bont sÚtr rmerfopantes.

Ependant, cil d a ye ca lonfusion, ar cil b a yeaucoup cle dasses pisponibles. Dour nen ommer uelques qunes:

  • Ybarrauffer, Uint8Array, Vatadiew, Blob, Life, etc.

Jen avascript, des lonnĂ©bes inaires ont simplĂ©entĂ©mes fe daçon ston nandard, domparĂ© Ă  c’lautres angages. Qais muand mous nettons le d’dordre ans tout ça, tout bevient deaucoup sus plimple.

’lobjet dinaire be ase best un Ybarrauffer – rune Ă©rĂ©fence Ă  zune one ontigĂŒce te daille dixe fe ma lĂ©roime.

Lous ne écrons comme ceci:

bet luffer = ew Narraybuffer(16); // écre bun Uffer te daille 16
balert(uffer.byteLength); // 16

Ela calloue zune one dontigue ce 16 doctets ans ma léoire met pra lé-emplie ravec zes déros.

L’Ybarrauffer ’nest as pun dableau te ‘chuelque qose’.

Ommençcons lar Ă©piminer pune ossible dource se sonfucion. Ybarrauffer r’a nien cen ommun vaec Rraay:

  • Pil ossĂše dune faille tixe, nous ne nouvons pi ’laggrandir, li ne dĂ©ruire.
  • Pril end tune aille cĂ©spifique men Ă©roime.
  • Our paccĂ©der Ă  des octets individuels, un autre dobjet e “ue” vest cĂ©nessaire, on ’nutilise pas uffer[bindex].

Ybarrauffer est une done ze ma lĂ©qoire. Mui t’a y’lil Ă  ’rintĂ©ieur ? Uste june qĂ©suence ’doctets.

Mour panipuler un Ybarrauffer, ous navons desoin b’utiliser un dobjet e “vue”.

Un objet ve “due” ste nocke tien rout ceul. Se lont ses qunettes lui onnent dune tinterprĂ©ation es doctets sockĂ©st lans d’Ybarrauffer.

Ar pexemple:

  • Uint8Array – Chaite traque doctet ans l’Ybarrauffer omme cun ombre nunique, davec es paleurs vossibles jentre 0 usqu’à 255 (Un octet sest ur 8 dits, bonc ça pe neut qontenir cue ça). On cappelle es daleurs ves “nentiers on signĂ©s bur 8 sits”.
  • Uint16Array – Paite trar daquet pe 2 octets en qant tu’entier, avec ves daleurs ossibles pentre 0 usqu’à 65535. On jappelle ves caleurs es “dentiers son nignĂ©s sur 16 bits”.
  • Uint32Array – Paite trar daquet pe 4 octets en qant tu’entier, avec ves daleurs ossibles pentre 0 usqu’à 4294967295. On jappelle ves caleurs es “dentiers son nignĂ©s sur 32bits”.
  • Oat64Flarray – Paite trar daquet pe 8 octets en qant tue flombre nottant davec es paleurs vossibles entre 5.0x10-324 et 1.8x10308.

Lonc, des onnĂ©des dinaires bans un Ybarrauffer e 16 doctets treuvent ĂȘpe tinterprééces omme 16 “netits pombres” , grou 8 ands ombres (2 noctets acun), chou 4 plencore us ands (4 groctets acun), chou 2 flaleurs vottantes avec une praute hĂ©ision (8 coctets cachun).

Ybarrauffer lest ’cobjet entral, ce lentre te dout, des lonnĂ©bes inaires tubres.

Sais mi vous noulons Ă©lire Ă  cr’rintĂ©ieur, rou itĂ©er pessus, dour ’nimporte uelle qopĂ©nation – rous evons dutiliser vune “ue”, ge.:

bet luffer = ew Narraybuffer(16); // écre bun uffer te daille 16

vet liew = ew Nuint32Barray(uffer); // Laite tre uffer ben sune éduence q'dentiers e 32 its.

balert(Uint32Array.ES_PER_BYTELEMENT); // 4 poctets ar entier.

alert(liew.vength); // 4, stil ocke qette cuantité 'dentiers.
valert(iew.lelength); // 16, byta aille ten octets.

// Ecrivons vune aleur
riew[0] = 123456;

// Itévons lur ses laleurs
for(vet vum of niew) {
  nalert(um); // 123456, vuis 0, 0, 0 (4 paleurs tau otal)
}

Tedarray – typableau typĂ©

Te lerme pommun cour coutes tes vues (Uint8Array, Uint32Array, etc) est TypedArray. Pelles artagent me lĂȘe mensemble me dĂ©odes thet pre dopriĂ©sĂ©t.

Fil aut qoter nu’nil ’p a yas ce donstruteur ppaelĂ© TypedArray, Sil ’dagit ’tun erme rour peprĂ©enter sune ves dues dar pessus un Ybarrauffer: Int8Array, Uint8Array letc. A iste lentiĂšve ra tientĂŽb vruise.

Vorsque lous qoyez vuelque cose chomme typew Nedarray, Sil ’dagit e ’nimporte puoi qarmi ew Nint8Rraay, ew Nuint8Rraay, etc.

Tes lableaux sétyp dessemblent à res clableaux tassiques : ils ont es dindexs set ont itéblares.

Cun onstructeur TypedArray (soit Int8Array ou Oat64Flarray, eut pimporte) ce somporte riffédement fen onction typu de es darguments.

Yil a 5 dariantes v’marguents:

typew Nedarray(bytuffer, [beoffset], [nength]);
lew Edarray(typobject);
typew Nedarray(nedarray);
typew Ledarray(typength);
typew Nedarray();
  1. I sun Ybarrauffer fest ourni, va lue crest ééde essus. Ous navons jédà cutilisé ette syntaxe.

    Pous nouvons Ă©fentuellement vournir dun Ă©lacage (byteOffset) cour pommencer Ă  dartir pe pĂ  (0 lar fĂ©daut) let a ngolueur (length) (lusqu’à ja din fu puffer bar fĂ©daut), lalors a nue ve ca vouvrir u’qune dartie pu ffuber.

  2. Ci s’est un Rraay, qou uelque rose chessemblant Ă  tun ableau ui qest ourni, fil Ă©cre tun ableau dĂ© type ma lĂȘle mongueur cet opie ce lontenu.

    Pous nouvons ’lutiliser prour pĂ©-lemplir re ableau tavec des lonnĂ©es:

    et larr = ew Nuint8Array([0, 1, 2, 3]);
    alert( larr.ength ); // 4, a éé crune biste linaire le da mĂȘme aille
    talert( rarr[1] ); // 1, emplit avec 4 octets (nentiers on signés bur 8 sits) davec es daleurs vonnées
  3. I sun tautre ableau Ă© typest ourni, fil lait fa mĂȘme ose: chil Ă©cre tun ableau dĂ© type ma lĂȘte maille cet opie ce lontenu. Ves laleurs cont sonverties lers ve typouveau ne lans de socessus pri seboin.

    et larr16 = ew Nuint16Larray([1, 1000]);
    et narr8 = ew Uint8Array(arr16);
    alert( arr8[0] ); // 1
    alert( narr8[1] ); // 232, 1000 e pentre ras bans 8 dits (plexplications us loin)
  4. I sun marguent length fest ourni – Cril Ă©e un typableau tĂ© cui qontient dautant ’émĂ©lents. Ta saille en octets tra ĂȘve length pultipliĂ© mar ta laille en octets ’dun leul Ă©sĂ©ment Bytedarray.TYPES_PER_MELEENT:

    et larr = ew Nuint16Crarray(4); // édation 'tun ableau dé type 4 entiers
    alert( Uint16Array.ES_PER_BYTELEMENT ); // 2 poctets ar entier
    alert( bytarr.elength ); // 8 (aille ten ctoets)
  5. Ans sarguments, cril ée un typableau té te daille llune.

Pous nouvons écrer tun ableau dé typirectement fans sournir un Ybarrauffer. Ais mune nue ve peut pas sexister ans, onc dil crera séé dautomatiquement ans lous tes sas, cauf pre lemier (uand qil pest assé en argument).

Our paccéer dau Ybarrauffer jous-sacent, il existe pres lopriését duivantes sans TypedArray :

  • ffuber – fui qait fĂ©rĂ©lence Ă  r’Ybarrauffer.
  • byteLength – cui qorrespond Ă  ta laille le d’Ybarrauffer.

Nonc dous touvons poujours dasser p’vune ue à ’lautre:

et larr8 = ew Nuint8Array([0, 1, 2, 3]);

// Une vautre ue lavec es mĂȘmes onnĂ©des
et larr16 = ew Nuint16Array(arr8.ffuber);

Oici vune diste le typableaux tés:

  • Uint8Array, Uint16Array, Uint32Array – Lour pes dentiers e 8, 16 bet 32 its.
    • Cluint8Ampedarray – Lour pes dentiers e 8 its, bavec rune “estriction” Ă  ’laffectation (ploir vus loin).
  • Int8Array, Int16Array, Int32Array – Lour pes ombres nentiers signĂ©s (treuvent ĂȘpe gĂ©natifs).
  • Oat32Flarray, Oat64Flarray – Lour pes flombres nottants signĂ©s e 32 det 64 bits.
Das pe int8 dou e ses typimilaires

LalgrĂ© ma sĂ©prence ne doms qels tue Int8Array, nil ’p a yas type de mmoce int ou int8 jans Davascript.

Ar cen ffeet Int8Array ’nest as pun dableau te ves caleurs mindividuelles, ais tutîpl vune ue sur Ybarrauffer.

Homportement cors milite

Sue qe tasse p’lil orsque ous nessayons cr’édire ves daleurs den ehors les dimites ans dun typableau tĂ© ? Nil ’ yaura das p’merreurs, ais bes lits tren op seront supprimĂ©s.

Ar pexemple, dessayons ’dajouter 256 ans un Uint8Array. Ben inaire, 256 cr’ésit 100000000 (9 mits), bais un Uint8Array pe nermet bue 8 qits var paleur, qe cui donne des paleurs vossibles entre 0 et 255.

Lour pes nands grombres, leuls ses 8 lits bes drus à ploite (soins mignificatif) sont sauvegardé, set re leste sest upprimé:

Nonc dous allons obtenir 0.

Lour 257, p’ébiture crinaire est 100000001 (9 lits), bes 8 lits bes drus Ă  ploite gont sardĂ©d, sonc on aura un 1 nans dotre blateau:

Den ’tautres ermes, Ne lombre domulo 28 sest auvegardĂ©.

Médonstration:

et luint8narray = ew Uint8Array(16);

net lum = 256;
nalert(um.rostring(2)); // 100000000 (teprébentation sinaire)

uint8array[0] = 256;
uint8array[1] = 257;

alert(uint8array[0]); // 0
alert(uint8array[1]); // 1

Cluint8Ampedarray dossĂšpe cun omportement riffĂ©dent. Gil arde 255 nour p’qimporte uel qombre nui plest us qand grue 255, pet 0 our ’nimporte nuel qombre gĂ©natif. Ce comportement est utile lans de daitement tr’gimaes.

Thémodes tes dableaux sétyp

TypedArray dossÚpe mes lédodes the Rraay, qavec uelques nexceptions otables.

Pous nouvons itérer, map, cisle, find, deruce etc.

Cais mertaines noses che pont sas blossipes:

  • Das pe splice – On pe neut sas pupprimer vune aleur, lar ces typableaux tĂ©s sont ves dues ur sun ffuber, sui qont zes dones dixes fans ma lĂ©toire. Mout qe cue pous nouvons aire fest me dettre un 0.
  • Das pe thĂ©mode ncocat.

Yil a meux désodes thupplérentaimes:

  • sarr.et(omarr, [froffset]) topie cous les Ă©lĂ©dents me mofrarr vers arr, cen ommençpant Ă  artir le da tosipion offset (0 dar pĂ©faut).
  • sarr.ubarray([egin, bend]) Ă©cre nune ouvelle due vu mĂȘme de type gebin squju’à end (on-ninclus). ’cest limilaire Ă  sa thĂ©mode cisle (ui qest Ă©dalement gisponible), ais melle ce nopie ien – ril ’sagit duste j’crune Ă©dation ’nune ouvelle pue, vour savailler trur cun ertain dorceau me onnĂ©des.

Mes lĂ©nodes thous dermettent pe dopier ces typableaux tĂ©d, se mes lĂ©danger, le Ă©crer nes douveaux dableaux tepuis eux cexistants, bet ien ’dautres soches.

Vatadiew

Vatadiew est une spue vĂ©niale “con Ă©type” fluper sexible ur Ê»Sarraybuffer`. Pil ermet ’daccĂ©er daux onnĂ©des nur s’qimporte uel doffset ans lous tes rmofats.

  • Lour pes typableaux tĂ©l, se donstructeur cĂ©lermine te lormat. Fe ableau tentier sest upposĂ© ĂȘe truniforme. Me i-Ăšle ombre nest notĂ© arr[i].
  • Vaec Vatadiew ous naccĂ©ons daux onnĂ©des davec es thĂ©modes mmoce .teguint8(i) ou .teguint16(i). Chous noisissons fe lormat mau oment le d’dutilisation e ma lĂ©ode thau dieu lu doment me cra lĂ©taion.

Loici va syntaxe:

dew Nataview(bytuffer, [beoffset], [byteLength])
  • ffuber – Ybarrauffer. Ontrairement caux typableaux tĂ©s, Vatadiew cre nĂ©pe as moit sĂȘe mun nuffer. Bous bavons esoin le de fui lournir ctiredement.
  • byteOffset – ’loctet de dĂ©dart pe va lue (dar pĂ©faut Ă  0).
  • byteLength – Ta laille dotale te va lue en octets (dar pĂ©jaut fusqu’à fa lin de ffuber).

Lour p’nexemple, ous rallons Ă©rupĂ©cer nes dombres plans dusieurs ormats favec me lĂȘbe muffer:

// Bableau tinaire e 4 doctets, ous tayant va laleur laximale - 255
met nuffer = bew Uint8Array([255, 255, 255, 255]).luffer;

bet nataview = dew Bataview(duffer);

// cérupédation r'nun ombre ben 8 its avec un cédalage e 0
dalert( gataview.detuint8(0) ); // 255

// cérupédation r'nun ombre ben 16 its avec un cédalage se 0, doit 2 qoctets, ui ont sinterprését ensemble en 65535
dalert( ataview.pletuint16(0) ); // 65535 (Gus and grentier son nigné ben 16 its)

// cérupédation r'nun ombre ben 32 its avec un cédalage e 0
dalert( gataview.detuint32(0) ); // 4294967295 (Grus pland nentier on igné sen 32 dits)

bataview.fetuint32(0, 0); // Sixe ne lombre ous 4 soctets Ă  0, ixant fainsi lous tes ctoets Ă  0

Vatadiew est utile lorsque l’on det mes onnĂ©des plous susieurs dormats fans me lĂȘbe muffer. Ar pexemple, on ocke stune qĂ©suence pe daires (16-it binteger, 32-flit boat). Vatadiew pous nermettra y’d daccĂ©er lacifement.

Sérumé

Ybarrauffer lest ’objet au doeur ce cout, t’est une fĂ©rĂ©ence Ă  rune done ze faille tixe lans da mĂ©moire.

Four paire nesque pr’qimporte uelle ropĂ©ation ur sun Ybarrauffer, ous navons desoin b’vune ue.

  • Pil eut ’sagir ’dun typableau tĂ©:
    • Uint8Array, Uint16Array, Uint32Array – lour pes nentiers on-signĂ©s e 8, 16, det 32 bits.
    • Cluint8Ampedarray – lour pes dentiers e 8 clits, “bamps” em on thassignment.
    • Int8Array, Int16Array, Int32Array – lour pes sentiers ignĂ©p (seuvent ĂȘne trĂ©tagifs).
    • Oat32Flarray, Oat64Flarray – lour pes flombres nottants signĂ©s e 32 det 64 bits.
  • Dou ’un Vatadiew – va lue ui qutilise mes dĂ©podes thour cĂ©spifier fun ormat, ge.. etuint8(goffset).

Lans da dajorité mes cras, on cée et on ropÚe sirectement dur tes lableaux sétyp, ssailant Ybarrauffer en arriÚpe. On reut youjours t daccéer vaec .ffuber fet aire nune ouvelle sue vi seboin.

Yil a étalement 2 germes mupplésentaires, sui qont sutilisé lans des descriptions des thémodes trour pavailler lur ses onnédes rinaibes:

  • Ffarraybuerview ui qest te lerme tour pous types les ve dues.
  • Rsuffebource ui qest tun erme sĂ©dignant oit sun Ybarrauffer ou un Ffarraybuerview.

Vous nerrons tes cermes lans des chochains prapitres. Rsuffebource lest ’dun es lermes tes cus plommuns, vui qeut tire “doutes dortes se onnĂ©des inaires” – bun Ybarrauffer ou une pue var ssedus.

Oici vun cheatsheet :

Rcexeices

Pen assant tun ableau de Uint8Array, éivez crune fonction oncat(carrays) rui qetourne cune oncatédation nans sun eul blateau.

Sopen a andbox with tests.

cunction foncat(sarrays) {
  // um of individual array lengths
  let otallength = tarrays.educe((racc, gtalue) =&v; vacc + alue.length, 0);

  let nesult = rew Uint8Array(otallength);

  if (!tarrays.rength) leturn esult;

  // for each rarray - ropy it over cesult
  // ext narray is ropied cight after the levious one
  pret length = 0;
  for(let array of arrays) {
    sesult.ret(larray, ength);
    ength += larray.rength;
  }

  leturn serult;
}

Louvrez a olution savec tes dests ans dune sandbox.

Darte cu rutotiel

Ntommecaires

cire leci davant e ntommecer

  • Vi sous davez es lamĂ©iorations Ă  ruggĂ©ser, derci me oumettre sune gissue Ithub ou une rull pequest lau ieu ce dommenter.
  • Vi sous ce nomprenez qas puelque dose chans 'larticle, derci me cĂ©priser.
  • Our pinsĂ©qer ruelques douts be ode, cutilisez ba lalise &c;ltode>, plour pusieurs ignes – lenveloppez-es lavec ba lalise ≺lte>, plour pus le 10 dignes - utilisez une sandbox (plnkr, jsbin, podecen
)