JavaScript Jest to język, który dobrze radzi sobie z ciągami znaków, ale ponieważ początkowo został zaprojektowany do obsługi dokumentów HTML, nie radzi sobie zbyt dobrze z danymi binarnymi, w rzeczywistości JavaScript nie ma typu danych binarnych jako taki, zawiera tylko liczby strukturalne lub typy.
Jak już wiemy Node.js oparta jest na JavaScript i może obsługiwać protokoły tekstowe, takie jak HTTP, gdzie można go również użyć do nawiązania komunikacji z bazami danych, manipulowania obrazami, a nawet obsługi manipulacji plikami, a ze względu na to, o czym mówiliśmy, robienie tego tylko za pomocą ciągów może być dość skomplikowane.
Ale aby znacznie ułatwić te zadania manipulacji binarnymi, Node.js zawiera implementację bufora binarnego, która pozwala bez większych problemów uzyskać i ustawić bajty utworzonego bufora.
WymaganiaAby wykonać ćwiczenia zaproponowane w tym samouczku, musimy mieć funkcjonalną instalację Node.js w naszym systemie możemy rzucić okiem na ten samouczek, zanim przejdziemy dalej. Ważne jest również, aby mieć dostęp do bogatego edytora tekstu do kodowania przykładów, możemy użyć tego, z czym czujemy się komfortowo, jednak ze względu na łatwość obsługi zalecamy Wzniosły tekst o NotePad ++, który ma również wtyczki do składni JavaScript Tak HTML.
Tworzenie bufora
Aby utworzyć bufor, wystarczy utworzyć nową instancję klasy Bufor(). Zobaczmy, jak tworzymy prosty bufor oparty na kodowaniu UTF-8 w następujący sposób:
var buf = new Buffer ('Witaj świecie!'); console.log (buf);Wykonamy nasz przykład za pomocą konsoli, aby zobaczyć odpowiedź, którą nam daje Node.js Odnośnie tworzenia naszego bufora:
Jak widzimy, jeśli wypiszemy naszą zmienną polerować, odpowiedź może nie być taka, jakiej się spodziewaliśmy, ale musimy pamiętać, że tworzymy instancję Bufor a to, co robi ta klasa, to kodowanie jej zawartości zgodnie z określonym kodowaniem znaków.
Możemy również utworzyć bufor ciągów z innymi kodowaniami, które będą ważne, o ile określimy to samo, co drugi argument, zobaczmy:
var buf2 = nowy bufor ('9b38kte610la', 'base64'); console.log (buf2);Jak widać możemy bez problemu określić kodowanie, zobaczmy więc jakie typy kodowania są akceptowane i ich odpowiednie identyfikatory:
ascii - ASCIIJest to standardowy typ kodowania i jest ograniczony kodowaniem znaków o tej samej nazwie.
utf8 - UTF-8Jest to zmienna z kodowaniem, która może reprezentować każdy istniejący znak Unicode i jest to domyślne kodowanie naszego bufora w przypadku braku określenia żadnego.
base64 - Base64Jest to typ kodowania używany do reprezentowania danych binarnych w formacie ciągu. ASCII i jest najczęściej używany do osadzania danych binarnych w dokumentach tekstowych, aby zapewnić, że dane pozostaną nienaruszone podczas transportu.
Dodatkowo, jeśli nie posiadamy początkowej zawartości naszego bufora i musimy go utworzyć, możemy to zrobić określając jego pojemność, w tym celu robimy to w następujący sposób:
var buf = nowy bufor (1024);Dzięki temu tworzymy 1024-bajtowy bufor dla naszych przyszłych operacji.
Obsługa bajtów w buforze
Po utworzeniu lub odebraniu bufora możemy chcieć go sprawdzić i zmienić jego zawartość. Po pierwsze, aby uzyskać dostęp do zawartych w nim bajtów, możemy użyć nawiasów w następujący sposób:
var buf = new Buffer ('tutaj jest zawartość mojego bufora'); console.log (buf [10]);Jeśli uruchomimy nasz przykład otrzymamy dziesiątą pozycję bufora, możemy nawet zmienić pozycję bufora na dziewiątą i zobaczyć wynik, zobaczmy jak to wygląda:
Jak widać, otrzymujemy losowe bajty dla pozycji naszego bufora, nawet jeśli potrzebujemy manipulować zawartością dowolnej pozycji w nim, możemy zrobić coś takiego:
var buf = new Buffer ('tutaj jest zawartość mojego nowego bufora'); buf [2] = 110; bf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);Zobaczmy odpowiedź konsoli naszego przykładu:
Jak widzieliśmy, bez większego problemu możemy modyfikować zawartość niektórych pozycji w naszym buforze, dodatkowo możemy uzyskać rozmiar naszego bufora za pomocą właściwości długość następująco:
var buf = nowy bufor (100); console.log (buf.length);Jeśli jesteśmy obserwatorami to widzimy, że odpowiedź naszej konsoli będzie wynosić 100, gdzie po uzyskaniu tej wartości możemy ją wykorzystać do iteracji po naszym buforze i tym samym manipulować każdą pozycją, aby uzyskać jej wartość lub ustawić konkretną wartość. prosty przykład tego:
var buf = nowy bufor (100); for (var i = 0; i <buf.długość; i++) {buf [i] = i; } console.log (buf);W tym przykładzie stworzyliśmy nowy bufor o pojemności 100 bajtów a następnie ustawiamy każdy bajt z wartością zaczynającą się od 0 do 99, na koniec zobaczmy odpowiedź konsoli gdy wykonamy nasz przykład:
Ekstrakcja danych z bufora
Inną interesującą cechą bufora, po jego utworzeniu lub odebraniu, jest możliwość wyodrębnienia jego części. Możemy go „pokroić”, aby to w jakiś sposób powiedzieć i utworzyć kolejny mniejszy bufor z tą porcją, którą pocięliśmy, nie zapominając o określeniu, skąd i dokąd go pokroimy, zobaczmy przykład ilustrujący to, co wyjaśniliśmy:
var buffer_complete = new Buffer ("to jest zawartość mojego bufora, którą zamierzamy pociąć"); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString ());Jak widać, najpierw tworzymy instancję naszego bufora z początkową zawartością, a następnie z funkcją plasterek () Określamy skąd i dokąd zamierzamy uzyskać treść, to co uzyskamy przypisujemy nowej zmiennej i na koniec dekodujemy treść aby móc zwizualizować zawartość naszego drugiego bufora, zobaczmy odpowiedź konsoli przy wykonywaniu przykład:
Należy wspomnieć, że kiedy wycinamy nowy bufor, nie używamy nowej pamięci systemowej, ten nowy bufor używa pamięci ojca, ponieważ odnosi się tylko do niej, ale z innym początkiem i końcem. Może to powodować pewne problemy, jeśli nie będziemy ostrożni, ponieważ pracujemy na tym samym buforze, w tym celu zalecamy pracę z metodą Kopiuj aby uniknąć problemów, które zobaczymy poniżej.
Kopiowanie bufora
Jak wspomnieliśmy, przy cięciu bufora możemy mieć pewne problemy, jeśli nie będziemy ostrożni, ale na to mamy metodę Kopiuj, który pozwala nam skopiować zawartość bufora do nowego bufora, wykorzystując nową instancję i nową przestrzeń pamięci, zobaczmy:
var buffer1 = new Buffer ("Bufor zawartości numer 1, zawartość do skopiowania"); var buffer2 = nowy bufor (20); var startobj = 0; var źródło początkowe = 26; var sourceEnd = 50; bufor1.copy (bufor2, startobj, startSource, endSource); console.log (buffer2.toString());Jak widać tworzymy dwa różne bufory, gdzie pierwszy będzie miał zawartość a drugi tylko rozmiar, określamy początek naszego drugiego bufora i w ten sam sposób wskazujemy początek i koniec dla nowy bufor, który skopiujemy, zobaczmy odpowiedź konsoli przy uruchomieniu przykładu:
Dekodowanie bufora
Jak widzieliśmy w poprzednich przykładach, byliśmy w stanie wydrukować oryginalną zawartość naszego bufora za pomocą metody toString (), to co się nazywa to dekodowanie bufora, gdzie podobnie jak instancja klasy Bufor() jeśli nic nie określamy, domyślnie dekodujemy to do UTF-8.
Możemy nawet dokonać transkodowania łańcucha UTF-8 do podstawa64 żeby wspomnieć o jednym przypadku, zobaczmy:
var stringutf8 = 'mój nowy ciąg'; var buf = nowy bufor (stringutf8); var base64string = buf.toString („base64”) console.log (base64string);Na koniec zobaczmy, jak transkodowaliśmy nasz oryginalny ciąg:
Na tym kończymy ten samouczek, w którym poznaliśmy sposoby radzenia sobie z danymi binarnymi w Node.js dzięki klasie Bufor, co pozwala nam manipulować nim poprzez jego odczytywanie, pisanie, uzyskiwanie jego małych fragmentów, kopiowanie go do nowych instancji, a nawet przekształcanie tego bufora w nowe typy kodowania w celu manipulowania nim w naszych programach.