Gestionarea bufferelor în Node.js

JavaScript Este un limbaj care are o bună manipulare a șirurilor, dar deoarece a fost inițial conceput pentru a gestiona documente HTML, nu este foarte bun la manipularea datelor binare, de fapt JavaScript nu are un tip de date binare ca atare, conține doar numere structurate sau tipuri.

După cum știm deja Node.js se bazeaza pe JavaScript și poate gestiona protocoale text cum ar fi HTTP, unde puteți utiliza, de asemenea, acest lucru pentru a stabili comunicarea cu baze de date, pentru a manipula imagini și chiar pentru a gestiona manipularea fișierelor și, din cauza a ceea ce am discutat, a face acest lucru doar cu șiruri poate fi destul de complicat.

Dar pentru a face aceste sarcini de manipulare binare mult mai ușoare, Node.js include o implementare tampon binar, care ne permite să obținem și să setăm octeții unui tampon creat fără probleme mari.

CerințePentru a efectua exercițiile propuse în acest tutorial trebuie să avem o instalare funcțională de Node.js în sistemul nostru, putem arunca o privire asupra acestui tutorial înainte de a continua să aprofundăm în el. De asemenea, este important să aveți acces la un editor de text bogat pentru a codifica exemplele, putem folosi orice ne simțim confortabil, totuși, pentru ușurința sa de utilizare, vă recomandăm Text sublim o NotePad ++ care are și pluginuri pentru sintaxă JavaScript Da HTML.

Crearea tamponului


Pentru a crea un buffer, este la fel de simplu ca crearea unei noi instanțe a clasei Tampon(). Să vedem cum creăm un buffer simplu bazat pe o codificare UTF-8 după cum urmează:
 var buf = new Buffer („Bună ziua lume!”); console.log (buf);
Vom executa exemplul nostru de consolă pentru a vedea răspunsul pe care ni-l oferă Node.js În ceea ce privește crearea tamponului nostru:

După cum vedem dacă imprimăm variabila noastră piele de bivol, răspunsul poate să nu fie ceea ce ne așteptam, dar trebuie să ne amintim că creăm o instanță de Tampon și ceea ce face această clasă este să-și codifice conținutul în funcție de codificarea caracterelor specifice.

De asemenea, putem crea un buffer de șiruri cu alte codificări, care va fi valabil atâta timp cât specificăm același argument ca al doilea argument, să vedem:

 var buf2 = tampon nou ('9b38kte610la', 'base64'); console.log (buf2);
După cum putem vedea, putem specifica codificarea fără nicio problemă, să vedem atunci ce tipuri de codificare sunt acceptate și identificatorii lor respectivi:

ascii - ASCIIAcesta este tipul de codificare standard și este limitat de codificarea caracterelor cu același nume.
utf8 - UTF-8Aceasta este o variabilă cu codificare care poate reprezenta fiecare caracter Unicode existent și aceasta este codificarea implicită a tamponului nostru în cazul în care nu se specifică niciunul.
base64 - Base64Acesta este un tip de codificare care este utilizat pentru a reprezenta date binare într-un tip de format șir. ASCII și este folosit mai ales pentru a încorpora date binare în documente text pentru a se asigura că datele rămân intacte în transportul lor.
În plus, dacă nu avem conținutul inițial pentru buffer-ul nostru și trebuie să creăm unul, îl putem face specificând capacitatea acestuia, pentru aceasta îl facem în felul următor:

 var buf = tampon nou (1024);
Cu aceasta, ceea ce facem este să creăm un buffer de 1024 de octeți pentru operațiunile noastre viitoare.

Manipularea octeților în buffer


După ce am creat sau am primit tamponul, este posibil să dorim să îl inspectăm și să-i schimbăm conținutul. În primul rând, pentru a accesa octeții din cadrul acestuia, putem utiliza parantezele după cum urmează:
 var buf = new Buffer („aici este conținutul bufferului meu”); console.log (buf [10]);
Dacă vom rula exemplul nostru vom obține a zecea poziție a bufferului, putem chiar să ne schimbăm în a noua poziție a bufferului și să vedem rezultatul, să vedem cum arată:

După cum putem vedea, obținem octeți aleatori pentru pozițiile tamponului nostru, chiar dacă trebuie să manipulăm conținutul oricărei poziții din acesta, putem face ceva de genul:

 var buf = new Buffer („aici este conținutul noului buffer”); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);
Să vedem răspunsul consolei din exemplul nostru:

După cum am văzut, putem modifica conținutul anumitor poziții din buffer-ul nostru fără prea multe probleme, în plus, putem obține dimensiunea buffer-ului nostru cu proprietatea lungime după cum urmează:

 var buf = tampon nou (100); console.log (buf.length);
Dacă suntem observatori, putem vedea că răspunsul consolei noastre va fi 100, unde, după obținerea acestei valori, îl putem folosi pentru a itera peste buffer-ul nostru și astfel putem manipula fiecare poziție pentru a obține valoarea sa sau pentru a seta o valoare specifică, Să vedem o exemplu simplu:
 var buf = tampon nou (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);
Ceea ce am făcut în acest exemplu a fost să creăm un nou tampon cu o capacitate de 100 de octeți și apoi setăm fiecare octet cu o valoare începând de la 0 la 99, în cele din urmă să vedem răspunsul consolei atunci când executăm exemplul nostru:

Extragerea datelor tampon


O altă caracteristică interesantă a bufferului, odată ce l-am creat sau primit, este să putem extrage o parte din acesta. Îl putem „tăia” pentru a-l spune într-un fel și a crea un alt tampon mai mic cu acea porțiune pe care am tăiat-o, fără a uita să specificăm de la și până unde o vom toca, să vedem un exemplu pentru a ilustra ceea ce am explicat:
 var buffer_complete = new Buffer („acesta este conținutul bufferului meu pe care îl vom tăia”); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString ());
După cum putem vedea, creăm mai întâi instanța tamponului nostru cu conținutul inițial, apoi cu funcția felie () Precizăm de la și către unde urmează să obținem conținutul, atribuim ceea ce obținem unei noi variabile și în cele din urmă decodăm conținutul pentru a putea vizualiza conținutul celui de-al doilea buffer, să vedem răspunsul de la consolă atunci când executăm exemplu:

Este important să menționăm că atunci când tăiem un tampon nou, nu folosim o memorie de sistem nouă, acest tampon nou utilizează memoria tatălui, deoarece se referă doar la acesta, dar cu un început și un sfârșit diferiți. Acest lucru poate cauza unele probleme dacă nu suntem atenți, deoarece lucrăm la același buffer, pentru aceasta vă recomandăm să lucrați cu metoda copie pentru a evita problemele, pe care le vom vedea mai jos.

Copierea unui tampon


După cum am menționat, atunci când tăiem un tampon putem obține unele probleme dacă nu suntem atenți, dar pentru aceasta avem metoda copie, care ne permite să copiem conținutul unui buffer într-un buffer nou, folosind o nouă instanță și un nou spațiu de memorie, să vedem:
 var buffer1 = new Buffer ("Buffer de conținut numărul 1, conținut de copiat"); var tampon2 = tampon nou (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString ());
După cum putem vedea, creăm două buffere diferite, unde primul va avea conținutul și al doilea va avea doar dimensiunea, specificăm începutul celui de-al doilea buffer și, în același mod, indicăm începutul și sfârșitul pentru tampon nou pe care îl vom copia, să vedem răspunsul consolei atunci când rulăm exemplul:

Decodarea unui tampon


După cum am văzut în exemplele anterioare, am reușit să imprimăm conținutul original al tamponului nostru folosind metoda toString (), ceea ce se numește este decodarea buffer-ului, în cazul în care instanța clasei Tampon() dacă nu specificăm nimic, în mod implicit îl decodăm în UTF-8.

Putem chiar să transcodăm un șir UTF-8 la baza64 pentru a menționa un caz, să vedem:

 var stringutf8 = 'noul meu șir'; var buf = tampon nou (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);
În cele din urmă, să vedem cum am transcodat șirul nostru original:

Cu aceasta terminăm acest tutorial în care am învățat modalitățile de a trata datele binare în Node.js datorită clasei Tampon, ceea ce ne permite să-l manipulăm din citirea, scrierea, obținerea unor mici bucăți din el, copierea acestuia în noi instanțe și chiar transformarea acestui tampon în noi tipuri de codificare pentru manipularea acestuia în programele noastre.

wave wave wave wave wave