JavaScript Je to jazyk, který dobře zpracovává řetězce, ale protože byl původně navržen pro zpracování dokumentů HTML, není příliš dobrý při zpracování binárních dat, ve skutečnosti JavaScript nemá binární datový typ jako takový, obsahuje pouze strukturovaná čísla nebo typy.
Jak již víme Node.js je založeno na JavaScript a zvládne textové protokoly, jako je HTTP, kde to můžete také použít k navázání komunikace s databázemi, manipulaci s obrázky a dokonce i manipulaci se soubory, a kvůli tomu, o čem jsme diskutovali, to může být docela složité.
Ale aby byly tyto úkoly binární manipulace mnohem jednodušší, Node.js obsahuje implementaci binární vyrovnávací paměti, která nám umožňuje získat a nastavit bajty vytvořené vyrovnávací paměti bez větších potíží.
PožadavkyAbychom mohli provádět cvičení navržená v tomto tutoriálu, musíme mít funkční instalaci Node.js v našem systému se můžeme podívat na tento tutoriál, než se do něj budeme dále ponořit. Je také důležité mít přístup k editoru formátovaného textu pro kódování příkladů, můžeme použít cokoli, co nám vyhovuje, nicméně pro jeho snadné použití doporučujeme Vznešený text o NotePad ++, které mají také doplňky pro syntaxi JavaScript Y HTML.
Vytváření vyrovnávací paměti
Vytvoření vyrovnávací paměti je stejně jednoduché jako vytvoření nové instance třídy Vyrovnávací paměť (). Podívejme se, jak vytvoříme jednoduchou vyrovnávací paměť na základě kódování UTF-8 následujícím způsobem:
var buf = new Buffer ('Hello world!'); console.log (buf);Náš příklad spustíme pomocí konzoly, abychom viděli odpověď, kterou nám dává Node.js Pokud jde o vytvoření naší vyrovnávací paměti:
Jak vidíme, pokud tiskneme naši proměnnou fanoušekOdpověď možná nebude taková, jakou jsme očekávali, ale musíme si uvědomit, že vytváříme instanci Vyrovnávací paměť a tato třída dělá kódování jejího obsahu podle konkrétního kódování znaků.
Můžeme také vytvořit řetězcovou vyrovnávací paměť s jinými kódováními, která budou platná, pokud zadáme totéž jako druhý argument, podívejme se:
var buf2 = new Buffer ('9b38kte610la', 'base64'); console.log (buf2);Jak vidíme, můžeme kódování zadat bez problémů, podívejme se tedy, jaké typy kódování jsou přijímány a jejich příslušné identifikátory:
ascii - ASCIIToto je standardní typ kódování a je omezen kódováním znaků se stejným názvem.
utf8 - UTF -8Jedná se o proměnnou s kódováním, které může představovat každý existující znak Unicode, a toto je výchozí kódování naší vyrovnávací paměti v případě, že žádný neuvedete.
base64 - Base64Toto je typ kódování, který se používá k reprezentaci binárních dat v typu formátu řetězce. ASCII a většinou se používá k vložení binárních dat do textových dokumentů, aby se zajistilo, že data zůstanou při přenosu nedotčena.
Kromě toho, pokud nemáme počáteční obsah pro naši vyrovnávací paměť a potřebujeme ji vytvořit, můžeme to provést zadáním její kapacity, proto to uděláme následujícím způsobem:
var buf = new Buffer (1024);Díky tomu vytvoříme vyrovnávací paměť 1024 bajtů pro naše budoucí operace.
Zpracování bajtů ve vyrovnávací paměti
Poté, co jsme vytvořili nebo přijali vyrovnávací paměť, můžeme ji chtít zkontrolovat a změnit její obsah. Nejprve pro přístup k bytům v něm můžeme použít závorky následovně:
var buf = new Buffer ('zde je obsah mého bufferu'); console.log (buf [10]);Pokud spustíme náš příklad, dostaneme desátou pozici vyrovnávací paměti, můžeme dokonce přejít na devátou pozici vyrovnávací paměti a uvidíme výsledek, uvidíme, jak to vypadá:
Jak vidíme, získáváme náhodné bajty pro pozice naší vyrovnávací paměti, i když potřebujeme manipulovat s obsahem jakékoli pozice v ní, můžeme udělat něco jako následující:
var buf = new Buffer ('zde je obsah mého nového bufferu'); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);Podívejme se na odpověď konzoly našeho příkladu:
Jak jsme viděli, mohli jsme bez problémů měnit obsah určitých pozic v naší vyrovnávací paměti, kromě toho můžeme pomocí vlastnosti získat velikost naší vyrovnávací paměti délka jak následuje:
var buf = nový Buffer (100); console.log (buf.length);Pokud jsme pozorovatelé, vidíme, že odezva naší konzoly bude 100, kde po získání této hodnoty ji můžeme použít k iteraci naší vyrovnávací paměti a tak manipulovat s každou pozicí, abychom získali její hodnotu nebo nastavili konkrétní hodnotu. jednoduchý příklad:
var buf = nový Buffer (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);V tomto příkladu jsme vytvořili nový vyrovnávací paměť s kapacitou 100 bajtů a poté nastavíme každý bajt hodnotou od 0 do 99, nakonec se podíváme na odpověď konzoly, když spustíme náš příklad:
Extrakce dat z vyrovnávací paměti
Další zajímavou vlastností vyrovnávací paměti, jakmile ji vytvoříme nebo přijmeme, je možnost extrahovat její část. Můžeme to „nasekat“, abychom to nějakým způsobem řekli, a vytvořit další menší vyrovnávací paměť s tou částí, kterou jsme sekli, aniž bychom zapomněli specifikovat, odkud a kam ji budeme sekat, podívejme se na příklad, který ilustruje, co jsme vysvětlili:
var buffer_complete = new Buffer ("toto je obsah mého bufferu, který budeme sekat"); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString ());Jak vidíme, nejprve vytvoříme instanci našeho bufferu s počátečním obsahem, poté s funkcí plátek () Specifikujeme, odkud a kam budeme získávat obsah, přiřadíme to, co získáme, nové proměnné a nakonec obsah dekódujeme, abychom mohli vizualizovat obsah našeho druhého bufferu, podívejme se na odpověď konzoly při provádění příklad:
Je důležité zmínit, že když vyjmeme novou vyrovnávací paměť, nepoužíváme novou systémovou paměť, tato nová vyrovnávací paměť používá paměť otce, protože se na ni pouze vztahuje, ale má jiný začátek a konec. Pokud nejsme opatrní, může to způsobit problémy, protože pracujeme na stejném bufferu, proto doporučujeme pracovat s touto metodou kopírovat abychom se vyhnuli problémům, které uvidíme níže.
Kopírování vyrovnávací paměti
Jak jsme zmínili, při řezání vyrovnávací paměti můžeme mít nějaké problémy, pokud ne, jsme opatrní, ale na to máme metodu kopírovat, což nám umožňuje zkopírovat obsah vyrovnávací paměti do nové vyrovnávací paměti pomocí nové instance a nového paměťového prostoru, podívejme se:
var buffer1 = nová vyrovnávací paměť („Obsah vyrovnávací paměti číslo 1, obsah ke kopírování“); var buffer2 = nová vyrovnávací paměť (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString ());Jak vidíme, vytvoříme dvě různé vyrovnávací paměti, kde první bude mít obsah a druhá bude mít pouze velikost, určíme začátek pro naši druhou vyrovnávací paměť a stejným způsobem označíme začátek a konec pro nový buffer, který zkopírujeme, podívejme se na odpověď konzoly při spuštění příkladu:
Dekódování vyrovnávací paměti
Jak jsme viděli v předchozích příkladech, dokázali jsme pomocí metody vytisknout původní obsah naší vyrovnávací paměti toString ()Toto se nazývá dekódování vyrovnávací paměti, kde se podobá instanci třídy Vyrovnávací paměť () pokud nic neurčíme, ve výchozím nastavení to dekódujeme UTF-8.
Můžeme dokonce provést transkódování řetězce UTF-8 na base64 abychom zmínili jeden případ, podívejme se:
var stringutf8 = 'můj nový řetězec'; var buf = nová vyrovnávací paměť (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);Nakonec se podívejme, jak jsme překódovali náš původní řetězec:
Tímto dokončujeme tento tutoriál, kde jsme se naučili způsoby, jak zacházet s binárními daty Node.js díky třídě Vyrovnávací paměť, což nám umožňuje manipulovat s jeho čtením, zápisem, získáváním malých kousků, kopírováním do nových instancí a dokonce transformací této vyrovnávací paměti na nové typy kódování pro její manipulaci v našich programech.