JavaScript Това е език, който има добра обработка на низове, но тъй като първоначално е проектиран да обработва HTML документи, той не е много добър в боравенето с двоични данни, всъщност JavaScript няма двоичен тип данни като такъв, съдържа само структурирани числа или видове.
Както вече знаем Node.js се основава на JavaScript и може да обработва текстови протоколи като HTTP, където можете също да използвате това за установяване на комуникация с бази данни, манипулиране на изображения и дори манипулиране на файлове и поради това, което обсъждахме да правим това само с низове, може да бъде доста сложно.
Но за да направим тези задачи за двоично манипулиране много по -лесни, Node.js включва изпълнение на двоичен буфер, което ни позволява да получаваме и задаваме байтове на създаден буфер без много проблеми.
ИзискванияЗа да изпълним упражненията, предложени в този урок, трябва да имаме функционална инсталация на Node.js в нашата система можем да разгледаме този урок, преди да продължим да се задълбочаваме в него. Също така е важно да имате достъп до богат текстов редактор, за да кодирате примерите, можем да използваме всичко, с което се чувстваме комфортно, но за неговата лекота на употреба препоръчваме Възвишен текст o NotePad ++, който също има плъгини за синтаксиса JavaScript Y HTML.
Създаване на буфер
За да създадете буфер, е толкова просто, колкото да създадете нов екземпляр на класа Буфер (). Нека да видим как създаваме прост буфер, базиран на UTF-8 кодиране, както следва:
var buf = нов буфер ('Здравей, свят!'); console.log (buf);Ще изпълним нашия пример чрез конзола, за да видим отговора, който ни дава Node.js Относно създаването на нашия буфер:
Както виждаме, ако отпечатаме нашата променлива привърженик, отговорът може да не е това, което очаквахме, но трябва да помним, че създаваме екземпляр на Буфер и това, което прави този клас, е да кодира съдържанието му според специфично кодиране на знаци.
Можем също така да създадем низов буфер с други кодировки, който ще бъде валиден, стига да посочим същото като втория аргумент, нека видим:
var buf2 = нов буфер ('9b38kte610la', 'base64'); console.log (buf2);Както виждаме, можем да посочим кодирането без никакви проблеми, нека видим тогава какви видове кодиране се приемат и съответните им идентификатори:
ascii - ASCIIТова е стандартният тип кодиране и е ограничен от кодирането на знаци със същото име.
utf8 - UTF -8Това е променлива с кодирането, което може да представлява всеки съществуващ Unicode символ и това е кодирането по подразбиране на нашия буфер в случай, че не е посочено такова.
base64 - Base64Това е вид кодиране, което се използва за представяне на двоични данни във вид формат на низ. ASCII и се използва най -вече за вграждане на двоични данни в текстови документи, за да се гарантира, че данните остават непокътнати при транспортирането им.
Освен това, ако нямаме първоначалното съдържание за нашия буфер и трябва да го създадем, можем да направим това, като посочим неговия капацитет, за това го правим по следния начин:
var buf = нов буфер (1024);С това, което правим, е да създадем 1024-байтов буфер за нашите бъдещи операции.
Обработка на байтове в буфера
След като сме създали или получили буфера, може да поискаме да го инспектираме и да променим съдържанието му. Първо, за достъп до байтовете в него, можем да използваме скобите, както следва:
var buf = нов буфер ('ето съдържанието на моя буфер'); console.log (buf [10]);Ако изпълним нашия пример, ще получим десетата позиция на буфера, можем дори да преминем към деветата позиция на буфера и да видим резултата, нека видим как изглежда:
Както виждаме, получаваме произволни байтове за позициите на нашия буфер, дори ако трябва да манипулираме съдържанието на всяка позиция в него, можем да направим нещо като следното:
var buf = нов буфер ('ето съдържанието на новия ми буфер'); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);Нека да видим конзолната реакция на нашия пример:
Както видяхме, можем да променим съдържанието на определени позиции в нашия буфер без много проблеми, в допълнение към това можем да получим размера на нашия буфер със свойството дължина както следва:
var buf = нов буфер (100); console.log (buf.length);Ако сме наблюдатели, можем да видим, че отговорът на нашата конзола ще бъде 100, където след получаване на тази стойност, можем да я използваме, за да повторим нашия буфер и по този начин да манипулираме всяка позиция, за да получим нейната стойност или да зададем конкретна стойност, Нека видим прост пример за това:
var buf = нов буфер (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);Това, което направихме в този пример, беше да създадем нов буфер с капацитет от 100 байта и след това задаваме всеки байт със стойност, започваща от 0 до 99, накрая нека видим реакцията на конзолата, когато изпълним нашия пример:
Извличане на буферни данни
Друга интересна характеристика на буфера, след като сме го създали или получили, е възможността да извлечем част от него. Можем да го „нарязваме“, за да го кажем по някакъв начин и да създадем друг по -малък буфер с тази част, която сме нарязали, без да забравяме да посочим от и до къде ще го нарежем, нека видим пример, който илюстрира това, което сме обяснили:
var buffer_complete = new Buffer ("това е съдържанието на моя буфер, което ще нарязваме"); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString ());Както виждаме, първо създаваме екземпляра на нашия буфер с първоначалното съдържание, след това с функцията филийка () Определяме от и до къде ще получим съдържанието, присвояваме това, което получаваме на нова променлива и накрая декодираме съдържанието, за да можем да визуализираме съдържанието на втория ни буфер, нека видим отговора от конзолата при изпълнение на пример:
Важно е да споменем, че когато изрязваме нов буфер, не използваме нова системна памет, този нов буфер използва паметта на бащата, тъй като се отнася само за него, но с различно начало и край. Това може да причини някои проблеми, ако не внимаваме, тъй като работим върху един и същ буфер, за това препоръчваме да работите с метода копие за да избегнем проблемите, които ще видим по -долу.
Копиране на буфер
Както споменахме, при изрязването на буфер можем да получим някои проблеми, ако не сме внимателни, но за това имаме метода копие, което ни позволява да копираме съдържанието на буфер в нов буфер, като използваме нов екземпляр и ново пространство в паметта, нека видим:
var buffer1 = нов буфер ("Буфер за съдържание номер 1, съдържание за копиране"); var buffer2 = нов буфер (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString ());Както можем да видим, ние създаваме два различни буфера, където първият ще има съдържание, а вторият ще има само размера, ние посочваме началото за втория ни буфер и по същия начин посочваме началото и края за нов буфер, който ще копираме, нека видим отговора на конзолата при изпълнение на примера:
Декодиране на буфер
Както видяхме в предишни примери, успяхме да отпечатаме оригиналното съдържание на нашия буфер, като използваме метода toString (), това, което се нарича, е декодиране на буфера, където подобно на екземпляра на класа Буфер () ако не посочим нищо, по подразбиране го декодираме в UTF-8.
Можем дори да направим транскодиране на низ UTF-8 да се base64 да споменем един случай, нека видим:
var stringutf8 = 'моят нов низ'; var buf = нов буфер (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);Накрая нека видим как сме транскодирали оригиналния ни низ:
С това завършваме този урок, където научихме начините за работа с двоични данни в Node.js благодарение на класа Буфер, което ни позволява да манипулираме от неговото четене, писане, получаване на малки части от него, копиране в нови екземпляри и дори трансформиране на този буфер в нови видове кодиране за манипулирането му в нашите програми.