Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat. Citeşte mai mult.

Un buffer este o locație specifică în memoria brută. Acesta servește ca spațiu de stocare temporar pentru excesul de date binare pe care unitatea de procesare nu le poate accepta în acel moment.

Node.js include o clasă Buffer. Se poate ocupa de date binare atunci când gestionează fluxurile TCP (Transfer Control Protocol) și operațiunile de citire-scriere pe un sistem de fișiere.

Aflați cum să creați, să citiți și să modificați conținutul unui buffer.

Crearea unui tampon

Pentru a crea un buffer în Node.js, veți folosi alloc() sau din() metode. The alloc() metoda creează un nou buffer, specificând dimensiunea acestuia în timpul creării ca primul și singurul parametru necesar. Este util atunci când nu aveți date de stocat în momentul creării tamponului.

Specificați parametrul dimensiunea bufferului în octeți când creați un buffer cu alloc() metodă. De exemplu:

instagram viewer
const buf = Buffer.alloc(8);
consolă.log (buf);
// ieșire:

Clasa Buffer adaugă automat zerouri ca valori de substituent pentru date noi atunci când le creați cu alloc() metodă.

Clasa Buffer exprimă fiecare valoare 0 ca 00, folosind formatul hexazecimal. În acest exemplu, conține un total de opt valori.

Pentru a inițializa Buffer-ul cu diferite valori de substituent, treceți o secundă completati parametru:

const buf_filled = Buffer.alloc(8, 5);
consolă.log (buf_filled);
// ieșire:

Acest obiect citează o porțiune din memorie care stochează 8 octeți ai valorii 05. Rețineți că, deși ați trecut un număr ca completati parametru, buffer-urile stochează numai datele în format binar.

După alocarea memoriei pentru Buffer, scrieți datele apelând la scrie() metodă:

const buf = Buffer.alloc(8);

buf.write("v", "utf-8");
consolă.log (buf)
// ieșire:

buf.write("va","utf-8");
consolă.log (buf)
// ieșire:

The scrie() metoda folosește codificarea caracterelor pentru a converti primul parametru, folosind utf-8 și apoi scrie șirul în Buffer. Adăugarea unui al doilea caracter la șir va umple al doilea octet.

Pentru a extrage date din tipurile de date existente, cum ar fi șiruri de caractere sau matrice, utilizați din() metodă. Această metodă creează buffer-uri din șiruri și matrice.

De exemplu:

// șir
const stringBuf = Buffer.from('şir')
consolă.log (stringBuf)
// ieșire:

// Matrice
const arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'hex')
consolă.log (arrayBuf);
// ieșire:

The din() metoda ia intrarea ca prim parametru, calculează numărul de octeți de care are nevoie pentru a codifica datele și apoi trimite rezultatul în Buffer. Prin furnizarea unui alt format de codare ca al doilea parametru, puteți suprascrie codarea implicită (UTF-8).

Trecând numere către din() metoda va duce la o eroare.

Citirea unui tampon

Deși tampoanele sunt similare cu matricele, ele nu sunt redimensionabile și pot face față date binare de calculator datorită metodelor încorporate.

Clasa Buffer ne permite să citim octeți individuali ai datelor sale folosind sintaxa parantezelor drepte JavaScript.

De exemplu:

const myBuf = Buffer.from('A mea');
consolă.Buturuga(MyBuf[1]);
// ieșire: 105

consolă.Buturuga(MyBuf[3]);
// ieșire: 101

consolă.Buturuga(MyBuf[5]);
// ieșire: nedefinit

Blocul de cod de mai sus folosește sintaxa parantezelor drepte pentru a obține valorile primului și al treilea octet în reprezentarea lor zecimală. Încercarea de a obține un octet invalid va avea ca rezultat un nedefinit eroare.

Pentru a accesa toate datele sale, clasa Buffer vine cu metode toJSON() și toString(), care obțin conținutul în două formate diferite.

The toString() metoda scoate un șir de caractere ca conținutul tamponului:

const myBuf = Buffer.from('A mea');
consolă.Buturuga(myBuf.toString());
// ieșire: „Al meu”

const numberBuf = Buffer.from([123]);
consolă.Buturuga(numărBuf.toString())
// ieșire: '{'

const emptyBuf = Buffer.alloc(5);
consolă.Buturuga(emptyBuf.toString());
// ieșire: „\\x00\\x00\\x00\\x00\\x00”

Primul apel inițializează Buffer-ul cu valoarea „A mea”, pe care apelul la toString îl replic. Al doilea exemplu folosește o matrice single-int pentru inițializare, care are o reprezentare șir ca „{" caracter. În ultimul caz, un Buffer cu cinci valori nule returnează șirul „\x00\x00\x00\x00\x00”. Șirul \x00 este reprezentarea hexazecimală a lui null.

The toString() metoda scoate întotdeauna rezultatul în format șir, indiferent de tipul de date cu care inițializați Bufferul.

The .toJSON() returnează reprezentarea zecimală a datelor Buffer, indiferent de datele pe care le-ați folosit pentru a inițializa Buffer-ul.

De exemplu:

const myBuf = Buffer.from('A mea');
consolă.Buturuga(myBuf.la JSON());
// ieșire: { tip: 'Tampon', date: [ 77, 105, 110, 101 ] }

Ieșirea JSON are un tip proprietate cu o valoare de Tampon pentru a-i indica originea. Proprietatea sa de date stochează o matrice de zecimale care reprezintă tabloul original de octeți.

Modificarea unui buffer

Similar cu accesarea octeților individuali ai unui Buffer, puteți modifica și octeții individuali ai conținutului unui Buffer folosind sintaxa parantezelor drepte.

Când utilizați sintaxa parantezei drepte pentru a modifica un conținut individual, puteți atribui doar reprezentarea zecimală a valorii.

De exemplu:

myBuf[0] = 70
consolă.Buturuga(myBuf.toString())
// ieșire: „Fine”

Deoarece bufferele sunt date binare, nu puteți da un șir unei anumite porțiuni a unui buffer. Dacă încercați să setați un octet individual la un șir, Buffer îl va traduce într-un caracter nul.

De exemplu:

myBuf[0] = 'F';
consolă.Buturuga(myBuf.toString());
// ieșire: „\\x00ine”

Alternativ, puteți modifica întregul conținut al unui buffer folosind scrie() metodă.

Luați în considerare inserarea unui index în afara lungimii Bufferului. În loc să returneze o eroare, Buffer ignoră indexul invalid și păstrează intact conținutul original al Buffer.

De exemplu, încercați să setați al cincilea element al myBuf la r prin reprezentarea sa zecimală a 114:

myBuf[4] = 114;
consolă.Buturuga(myBuf.toString());
// ieșire: „Al meu”

Observați că toString() metoda returnează aceeași valoare 'A mea'.

Deoarece nu puteți redimensiona un buffer, încercarea de a scrie mai multe date decât poate deține cineva va duce la eliminarea datelor suplimentare. De exemplu:

const buf1 = Buffer.alloc(5)
buf1.write('număr');
consolă.Buturuga(buf1.toString())
// ieșire: 'numbe'

Folosind toString() metoda de confirmare a datelor tampon, se întoarce „numbe” Mai degrabă decât 'număr'. Care este argumentul inserat în interiorul scrie() metodă.

Tamponele scriu în serie începând cu indicele zero. The scrie() metoda adaugă în serie octeți la un buffer, suprascriind orice date anterioare.

De exemplu:

const buf2 = Buffer.alloc(6);

buf2.write('membru');
consolă.Buturuga(buf2.toString())
// ieșire: „membru”

buf2.write('Bună');
consolă.Buturuga(buf2.toString());
// ieșire: 'himber'

Codul de mai sus creează un buffer de șase octeți și adaugă șirul „membru" la el folosind scrie() metodă.

Apoi actualizează memoria tampon cu conținut nou care ocupă mai puțin spațiu de memorie decât conținutul anterior.

Acest lucru are ca rezultat crearea unui șir nou cu primii doi octeți suprascriși și octeții rămași lăsați nemodificați.

Multe API-uri și structuri de date utilizează tampon

Acum știți cum să creați un buffer, să scrieți într-unul, să citiți conținutul acestuia și să îl modificați cu metodele adecvate.

Există câteva alte metode disponibile pentru a lucra cu clasa Node.js Buffer.

Ar trebui să cunoașteți aceste metode și să înțelegeți Buffer-urile pentru a înțelege cum funcționează diferite concepte precum fluxurile și sistemele de fișiere.