Håndtering af buffere i Node.js

JavaScript Det er et sprog, der har en god håndtering af strenge, men fordi det oprindeligt var designet til at håndtere HTML -dokumenter, er det ikke særlig godt til at håndtere binære data, faktisk har JavaScript ikke en binær datatype som sådan, indeholder kun strukturerede tal eller typer.

Som vi allerede ved Node.js er baseret på JavaScript og det kan håndtere tekstprotokoller som HTTP, hvor du også kan bruge dette til at etablere kommunikation med databaser, manipulere billeder og endda håndtere filmanipulation og på grund af det, vi diskuterede, kan det være ret kompliceret at gøre dette med kun strenge.

Men for at gøre disse binære manipulationsopgaver meget lettere, Node.js indeholder en binær bufferimplementering, som giver os mulighed for at opnå og indstille bytes for en oprettet buffer uden store problemer.

KravFor at udføre de øvelser, der foreslås i denne vejledning, skal vi have en funktionel installation af Node.js i vores system, kan vi tage et kig på denne vejledning, før vi fortsætter med at dykke ned i den. Det er også vigtigt at have adgang til en rich text -editor til at kode eksemplerne, vi kan bruge alt, hvad vi føler os trygge ved, men for dets brugervenlighed anbefaler vi Sublim tekst o NotePad ++ som også har plugins til syntaksen JavaScript Y HTML.

Buffer oprettelse


For at oprette en buffer er det lige så enkelt som at lave en ny forekomst af klassen Buffer (). Lad os se, hvordan vi opretter en simpel buffer baseret på en UTF-8-kodning som følger:
 var buf = ny buffer ('Hej verden!'); console.log (buf);
Vi kommer til at eksekvere vores eksempel ved konsol for at se det svar, det giver os Node.js Med hensyn til oprettelsen af ​​vores buffer:

Som vi ser, om vi udskriver vores variabel buff, svaret er muligvis ikke det, vi havde forventet, men vi skal huske, at vi skaber en forekomst af Buffer og hvad denne klasse gør, er at kode sit indhold i henhold til specifik tegnkodning.

Vi kan også oprette en strengbuffer med andre kodninger, som er gyldige, så længe vi angiver det samme som det andet argument, lad os se:

 var buf2 = ny buffer ('9b38kte610la', 'base64'); console.log (buf2);
Som vi kan se, kan vi angive kodningen uden problemer, lad os derefter se, hvilke typer kodning der accepteres og deres respektive identifikatorer:

ascii - ASCIIDette er standardkodningstypen og er begrænset af tegnkodningen med samme navn.
utf8 - UTF -8Dette er en variabel med kodningen, der kan repræsentere hvert eksisterende Unicode -tegn, og dette er standardkodningen af ​​vores buffer, hvis der ikke angives nogen.
base64 - Base64Dette er en type kodning, der bruges til at repræsentere binære data i en type strengformat. ASCII og det bruges mest til at integrere binære data i tekstdokumenter for at sikre, at dataene forbliver intakte i transporten.
Hvis vi ikke har det oprindelige indhold til vores buffer, og vi skal oprette en, kan vi gøre det ved at specificere dens kapacitet, for dette gør vi det på følgende måde:

 var buf = ny buffer (1024);
Med dette er det, vi gør, at oprette en 1024-byte buffer til vores fremtidige operationer.

Håndtering af bytes i bufferen


Efter at vi har oprettet eller modtaget bufferen, vil vi måske inspicere den og ændre dens indhold. For det første kan vi bruge parenteserne for at få adgang til bytes i den:
 var buf = new Buffer ('her er indholdet af min buffer'); console.log (buf [10]);
Hvis vi kører vores eksempel, får vi den tiende position af bufferen, vi kan endda skifte til den niende position af bufferen og se resultatet, lad os se, hvordan det ser ud:

Som vi kan se, opnår vi tilfældige bytes for positionerne i vores buffer, selvom vi har brug for at manipulere indholdet i enhver position i den, kan vi gøre noget som følgende:

 var buf = new Buffer ('her er indholdet af min nye buffer'); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);
Lad os se konsolresponsen i vores eksempel:

Som vi så, kunne vi ændre indholdet af bestemte positioner i vores buffer uden store problemer, ud over dette kan vi få størrelsen på vores buffer med ejendommen længde som følger:

 var buf = ny buffer (100); console.log (buf.length);
Hvis vi er observatører, kan vi se, at svaret på vores konsol vil være 100, hvor vi efter at have opnået denne værdi kan bruge den til at gentage over vores buffer og dermed manipulere hver position for at opnå dens værdi eller angive en bestemt værdi, Lad os se en enkelt eksempel på dette:
 var buf = ny buffer (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);
Hvad vi gjorde i dette eksempel var at oprette en ny buffer med en kapacitet på 100 bytes, og derefter sætter vi hver byte med en værdi, der starter fra 0 til 99, lad os endelig se konsolens svar, når vi udfører vores eksempel:

Udtræk af bufferdata


Et andet interessant træk ved bufferen, når vi først har oprettet eller modtaget den, er at kunne udtrække en del af den. Vi kan "hakke" det for at sige det på en eller anden måde og oprette en anden mindre buffer med den portion, vi har hakket, uden at glemme at angive fra og til hvor vi vil hakke det, lad os se et eksempel for at illustrere, hvad vi har forklaret:
 var buffer_complete = ny buffer ("dette er indholdet af min buffer, som vi skal hugge"); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString ());
Som vi kan se, opretter vi først instansen af ​​vores buffer med det oprindelige indhold, derefter med funktionen skive () Vi specificerer fra og til, hvor vi skal hente indholdet, vi tildeler det, vi får til en ny variabel, og til sidst dekoder vi indholdet for at kunne visualisere indholdet i vores anden buffer, lad os se svaret ved konsol, når vi udfører eksempel:

Det er vigtigt at nævne, at når vi skærer en ny buffer, bruger vi ikke ny systemhukommelse, denne nye buffer bruger faderens hukommelse, da den kun refererer til den, men med en anden begyndelse og slutning. Dette kan forårsage nogle problemer, hvis vi ikke er forsigtige, da vi arbejder på den samme buffer, derfor anbefaler vi at arbejde med metoden kopi for at undgå problemerne, som vi vil se nedenfor.

Kopiering af en buffer


Som vi nævnte, når vi skærer en buffer, kan vi få nogle problemer, hvis ikke vi er forsigtige, men til dette har vi metoden kopi, som giver os mulighed for at kopiere indholdet af en buffer til en ny buffer ved hjælp af en ny forekomst og et nyt hukommelsesrum, lad os se:
 var buffer1 = ny buffer ("Indholdsbuffer nummer 1, indhold der skal kopieres"); var buffer2 = ny buffer (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString ());
Som vi kan se, opretter vi to forskellige buffere, hvor den første vil have indholdet og den anden kun vil have størrelsen, vi angiver begyndelsen for vores anden buffer, og på samme måde angiver vi begyndelsen og slutningen for ny buffer, som vi vil kopiere, lad os se konsolens svar, når eksemplet køres:

Afkodning af en buffer


Som vi så i tidligere eksempler, var vi i stand til at udskrive det originale indhold i vores buffer ved hjælp af metoden toString (), dette er det, der kaldes, er afkodning af bufferen, hvor ligesom instansen af ​​klassen Buffer () hvis vi ikke angiver noget, dekoder vi det som standard til UTF-8.

Vi kan endda lave en omkodning af en streng UTF-8 til base64 Lad os se for at nævne en sag:

 var stringutf8 = 'min nye streng'; var buf = ny buffer (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);
Lad os endelig se, hvordan vi har omkodet vores originale streng:

Med dette afslutter vi denne vejledning, hvor vi lærte måderne at håndtere binære data på Node.js tak til klassen Buffer, som giver os mulighed for at manipulere det fra dets læsning, skrivning, opnåelse af små stykker af det, kopiering af det til nye instanser og endda omdanne denne buffer til nye typer kodning til manipulation i vores programmer.

wave wave wave wave wave