JavaScript Het is een taal die goed omgaat met strings, maar omdat het oorspronkelijk ontworpen was om HTML-documenten te verwerken, is het niet erg goed in het omgaan met binaire gegevens, in feite heeft JavaScript geen binair gegevenstype als zodanig, bevat het alleen gestructureerde getallen of typen.
Zoals we al weten Node.js is gebaseerd op JavaScript en het kan tekstprotocollen zoals HTTP aan, waar je dit ook kunt gebruiken om communicatie met databases tot stand te brengen, afbeeldingen te manipuleren en zelfs bestandsmanipulatie af te handelen en vanwege wat we hebben besproken, kan het behoorlijk ingewikkeld zijn om dit met alleen strings te doen.
Maar om deze binaire manipulatietaken veel gemakkelijker te maken, Node.js bevat een binaire bufferimplementatie, waarmee we de bytes van een gemaakte buffer zonder veel moeite kunnen verkrijgen en instellen.
VereistenOm de oefeningen die in deze tutorial worden voorgesteld uit te voeren, moeten we een functionele installatie hebben van: Node.js in ons systeem kunnen we deze tutorial bekijken voordat we ons er verder in gaan verdiepen. Het is ook belangrijk om toegang te hebben tot een rich text-editor om de voorbeelden te coderen, we kunnen alles gebruiken waar we ons prettig bij voelen, maar vanwege het gebruiksgemak raden we aan Sublieme tekst o NotePad ++ die ook plug-ins hebben voor de syntaxis JavaScript Y HTML.
Buffer aanmaken
Om een buffer te maken, is het net zo eenvoudig als het maken van een nieuwe instantie van de klasse Buffer(). Laten we eens kijken hoe we als volgt een eenvoudige buffer maken op basis van een UTF-8-codering:
var buf = nieuwe buffer ('Hallo wereld!'); console.log (buf);We gaan ons voorbeeld per console uitvoeren om het antwoord te zien dat het ons geeft Node.js Wat betreft het aanmaken van onze buffer:
Zoals we zien als we onze variabele afdrukken buff, is het antwoord misschien niet wat we verwachtten, maar we moeten niet vergeten dat we een instantie maken van Buffer en wat deze klasse doet, is zijn inhoud coderen volgens specifieke tekencodering.
We kunnen ook een stringbuffer maken met andere coderingen, die geldig zal zijn zolang we hetzelfde specificeren als het tweede argument, laten we eens kijken:
var buf2 = nieuwe buffer ('9b38kte610la', 'base64'); console.log (buf2);Zoals we kunnen zien, kunnen we de codering zonder enig probleem specificeren, laten we eens kijken welke soorten codering worden geaccepteerd en hun respectievelijke identifiers:
ascii - ASCIIDit is het standaard coderingstype en wordt beperkt door de tekencodering met dezelfde naam.
utf8 - UTF-8Dit is een variabele met de codering die elk bestaand Unicode-teken kan vertegenwoordigen en dit is de standaardcodering van onze buffer in het geval dat er geen wordt gespecificeerd.
base64 - Base64Dit is een type codering dat wordt gebruikt om binaire gegevens weer te geven in een soort tekenreeksindeling. ASCII en het wordt meestal gebruikt om binaire gegevens in tekstdocumenten in te sluiten om ervoor te zorgen dat de gegevens intact blijven tijdens het transport.
Bovendien, als we de initiële inhoud voor onze buffer niet hebben en we er een moeten maken, kunnen we dit doen door de capaciteit ervan op te geven, hiervoor doen we het op de volgende manier:
var buf = nieuwe buffer (1024);Hiermee creëren we een buffer van 1024 bytes voor onze toekomstige activiteiten.
Behandeling van bytes in de buffer
Nadat we de buffer hebben gemaakt of ontvangen, willen we deze misschien inspecteren en de inhoud ervan wijzigen. Ten eerste, om toegang te krijgen tot de bytes erin, kunnen we de haakjes als volgt gebruiken:
var buf = nieuwe buffer ('hier is de inhoud van mijn buffer'); console.log (buf [10]);Als we ons voorbeeld uitvoeren, krijgen we de tiende positie van de buffer, we kunnen zelfs naar de negende positie van de buffer gaan en het resultaat zien, laten we eens kijken hoe het eruit ziet:
Zoals we kunnen zien, verkrijgen we willekeurige bytes voor de posities van onze buffer, zelfs als we de inhoud van een willekeurige positie erin moeten manipuleren, kunnen we zoiets als het volgende doen:
var buf = nieuwe buffer ('hier is de inhoud van mijn nieuwe buffer'); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);Laten we de consolereactie van ons voorbeeld bekijken:
Zoals we zagen, konden we zonder veel problemen de inhoud van bepaalde posities binnen onze buffer wijzigen, daarnaast kunnen we de grootte van onze buffer verkrijgen met de eigenschap lengte als volgt:
var buf = nieuwe buffer (100); console.log (buf.lengte);Als we waarnemers zijn, kunnen we zien dat de respons van onze console 100 zal zijn, waar we na het verkrijgen van deze waarde deze kunnen gebruiken om onze buffer te herhalen en zo elke positie te manipuleren om zijn waarde te verkrijgen of een specifieke waarde in te stellen. Laten we eens kijken een simpel voorbeeld hiervan:
var buf = nieuwe buffer (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);Wat we in dit voorbeeld deden, was een nieuwe buffer met een capaciteit van 100 bytes en dan stellen we elke byte in met een waarde van 0 tot 99, laten we ten slotte de reactie van de console bekijken wanneer we ons voorbeeld uitvoeren:
Extractie van buffergegevens
Een ander interessant kenmerk van de buffer, als we deze eenmaal hebben gemaakt of ontvangen, is dat we er een deel van kunnen extraheren. We kunnen het "hakken" om het op de een of andere manier te zeggen en een andere kleinere buffer maken met dat deel dat we hebben gehakt, zonder te vergeten te specificeren van en naar waar we het zullen hakken, laten we een voorbeeld bekijken om te illustreren wat we hebben uitgelegd:
var buffer_complete = nieuwe buffer ("dit is de inhoud van mijn buffer die we gaan hakken"); var buffer_small = volledige_buffer.slice (26, 55); console.log (buffer_small.toString ());Zoals we kunnen zien, maken we eerst de instantie van onze buffer met de initiële inhoud en vervolgens met de functie plak () We specificeren van en naar waar we de inhoud gaan ophalen, we wijzen wat we verkrijgen toe aan een nieuwe variabele en ten slotte decoderen we de inhoud om de inhoud van onze tweede buffer te kunnen visualiseren, laten we de reactie per console bekijken bij het uitvoeren van de voorbeeld:
Het is belangrijk om te vermelden dat wanneer we een nieuwe buffer knippen, we geen nieuw systeemgeheugen gebruiken, deze nieuwe buffer gebruikt het geheugen van de vader omdat het er alleen naar verwijst, maar met een ander begin en einde. Dit kan problemen veroorzaken als we niet voorzichtig zijn, omdat we aan dezelfde buffer werken, hiervoor raden we aan om met de methode te werken kopiëren om de problemen te vermijden, die we hieronder zullen zien.
Een buffer kopiëren
Zoals we al zeiden, kunnen we bij het snijden van een buffer wat problemen krijgen als we niet voorzichtig zijn, maar hiervoor hebben we de methode kopiëren, waarmee we de inhoud van een buffer naar een nieuwe buffer kunnen kopiëren, met een nieuwe instantie en een nieuwe geheugenruimte, laten we eens kijken:
var buffer1 = nieuwe buffer ("Contentbuffer nummer 1, te kopiëren inhoud"); var buffer2 = nieuwe buffer (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString ());Zoals we kunnen zien, maken we twee verschillende buffers, waarbij de eerste de inhoud heeft en de tweede alleen de grootte, we specificeren het begin voor onze tweede buffer en op dezelfde manier geven we het begin en het einde aan voor de nieuwe buffer die we zullen kopiëren, laten we de reactie van de console bekijken bij het uitvoeren van het voorbeeld:
Een buffer decoderen
Zoals we in eerdere voorbeelden zagen, konden we de originele inhoud van onze buffer afdrukken met behulp van de methode toString (), dit wat wordt genoemd, is het decoderen van de buffer, zoals de instantie van de klasse Buffer() als we niets specificeren, decoderen we het standaard naar UTF-8.
We kunnen zelfs een transcodering van een string doen UTF-8 tot base64 om één geval te noemen, laten we eens kijken:
var stringutf8 = 'mijn nieuwe tekenreeks'; var buf = nieuwe buffer (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);Laten we tot slot eens kijken hoe we onze originele string hebben getranscodeerd:
Hiermee sluiten we deze tutorial af waarin we de manieren hebben geleerd om met binaire gegevens om te gaan in Node.js dankzij de klas Buffer, waarmee we het kunnen manipuleren vanaf het lezen, schrijven, het verkrijgen van kleine stukjes ervan, het kopiëren naar nieuwe instanties en zelfs die buffer transformeren naar nieuwe soorten codering voor de manipulatie ervan in onze programma's.