JavaScript È un linguaggio che ha una buona gestione delle stringhe, ma poiché è stato inizialmente progettato per gestire i documenti HTML, non è molto bravo a gestire i dati binari, infatti JavaScript non ha un tipo di dati binari in quanto tale, contiene solo numeri strutturati o tipi.
Come già sappiamo Nodo.js è basato su JavaScript e può gestire protocolli di testo come HTTP, dove puoi anche usarlo per stabilire comunicazioni con database, manipolare immagini e persino gestire la manipolazione di file e, a causa di ciò che abbiamo discusso, farlo con solo stringhe può essere piuttosto complicato.
Ma per rendere queste attività di manipolazione binaria molto più semplici, Nodo.js include un'implementazione del buffer binario, che ci consente di ottenere e impostare i byte di un buffer creato senza troppi problemi.
RequisitiPer svolgere gli esercizi proposti in questo tutorial dobbiamo avere un'installazione funzionale di Nodo.js nel nostro sistema, possiamo dare un'occhiata a questo tutorial prima di continuare ad approfondire. È anche importante poter avere accesso a un editor di testo ricco per codificare gli esempi, possiamo usare qualunque cosa ci sentiamo a nostro agio, tuttavia, per la sua facilità d'uso, consigliamo Testo sublime o NotePad ++ che ha anche plugin per la sintassi JavaScript sì HTML.
Creazione del buffer
Per creare un buffer, è semplice come creare una nuova istanza della classe Respingente(). Vediamo come creiamo un semplice buffer basato su una codifica UTF-8 come segue:
var buf = new Buffer ('Ciao mondo!'); console.log (buf);Eseguiamo il nostro esempio da console per vedere la risposta che ci dà Nodo.js Per quanto riguarda la creazione del nostro buffer:
Come vediamo se stampiamo la nostra variabile in forma, la risposta potrebbe non essere quella che ci aspettavamo, ma dobbiamo ricordare che stiamo creando un'istanza di Respingente e ciò che fa questa classe è codificare il suo contenuto in base alla codifica dei caratteri specifica.
Possiamo anche creare un buffer di stringa con altre codifiche, che sarà valido fintanto che specifichiamo lo stesso come secondo argomento, vediamo:
var buf2 = nuovo Buffer ('9b38kte610la', 'base64'); console.log (buf2);Come possiamo vedere possiamo specificare la codifica senza alcun problema, vediamo allora quali tipi di codifica sono accettati e i loro rispettivi identificatori:
ascii - ASCIIQuesto è il tipo di codifica standard ed è limitato dalla codifica dei caratteri con lo stesso nome.
utf8 - UTF-8Questa è una variabile con la codifica che può rappresentare ogni carattere Unicode esistente e questa è la codifica predefinita del nostro buffer nel caso in cui non ne specifichi nessuno.
base64 - Base64Questo è un tipo di codifica utilizzata per rappresentare i dati binari in un tipo di formato stringa. ASCII ed è principalmente utilizzato per incorporare dati binari in documenti di testo per garantire che i dati rimangano intatti nel loro trasporto.
Inoltre, se non abbiamo il contenuto iniziale per il nostro buffer e dobbiamo crearne uno, possiamo farlo specificando la sua capacità, per questo lo facciamo nel modo seguente:
var buf = nuovo Buffer (1024);Con questo, ciò che facciamo è creare un buffer di 1024 byte per le nostre operazioni future.
Gestione dei byte nel buffer
Dopo aver creato o ricevuto il buffer, potremmo volerlo ispezionare e modificarne il contenuto. Innanzitutto, per accedere ai byte al suo interno, possiamo utilizzare le parentesi come segue:
var buf = new Buffer ("ecco il contenuto del mio buffer"); console.log (buf [10]);Se eseguiamo il nostro esempio, otterremo la decima posizione del buffer, possiamo anche passare alla nona posizione del buffer e vedere il risultato, vediamo come appare:
Come possiamo vedere, otteniamo byte casuali per le posizioni del nostro buffer, anche se abbiamo bisogno di manipolare il contenuto di qualsiasi posizione in esso, possiamo fare qualcosa del genere:
var buf = new Buffer ('ecco il contenuto del mio nuovo buffer'); buf [2] = 110; buf [6] = 180; buf [10] = 90; console.log (buf [2]); console.log (buf [6]); console.log (buf [10]);Vediamo la risposta della console del nostro esempio:
Come abbiamo visto potremmo modificare il contenuto di determinate posizioni all'interno del nostro buffer senza troppi problemi, oltre a questo possiamo ottenere la dimensione del nostro buffer con la proprietà lunghezza come segue:
var buf = nuovo Buffer (100); console.log (buf.length);Se siamo osservatori possiamo vedere che la risposta della nostra console sarà 100, dove dopo aver ottenuto questo valore, possiamo usarlo per iterare sul nostro buffer e quindi manipolare ogni posizione per ottenere il suo valore o impostare un valore specifico, Vediamo un semplice esempio di questo:
var buf = nuovo Buffer (100); for (var i = 0; i <buf.length; i ++) {buf [i] = i; } console.log (buf);Quello che abbiamo fatto in questo esempio è stato creare un nuovo respingente con una capacità di 100 byte e quindi impostiamo ogni byte con un valore che parte da 0 a 99, infine vediamo la risposta della console quando eseguiamo il nostro esempio:
Estrazione dei dati del buffer
Un'altra caratteristica interessante del buffer, una volta che lo abbiamo creato o ricevuto, è quello di poterne estrarre una porzione. Possiamo "sminuzzarlo" per dirlo in qualche modo e creare un altro buffer più piccolo con quella porzione che abbiamo tritato, senza dimenticare di specificare da e verso dove lo taglieremo, vediamo un esempio per illustrare quanto abbiamo spiegato:
var buffer_complete = new Buffer ("questo è il contenuto del mio buffer che andremo a tagliare"); var buffer_small = full_buffer.slice (26, 55); console.log (buffer_small.toString());Come possiamo vedere, creiamo prima l'istanza del nostro buffer con il contenuto iniziale, poi con la funzione fetta () Specifichiamo da e verso dove andremo ad ottenere il contenuto, assegniamo ciò che otteniamo a una nuova variabile e infine decodifichiamo il contenuto per poter visualizzare il contenuto del nostro secondo buffer, vediamo la risposta da console durante l'esecuzione del esempio:
È importante ricordare che quando tagliamo un nuovo buffer non stiamo usando una nuova memoria di sistema, questo nuovo buffer utilizza la memoria del padre poiché si riferisce solo ad esso ma con un inizio e una fine diversi. Questo può causare alcuni problemi se non stiamo attenti poiché stiamo lavorando sullo stesso buffer, per questo consigliamo di lavorare con il metodo copia per evitare i problemi, che vedremo di seguito.
Copiare un buffer
Come abbiamo detto, quando si taglia un buffer possiamo avere dei problemi se non stiamo attenti, ma per questo abbiamo il metodo copia, che ci permette di copiare il contenuto di un buffer in un nuovo buffer, utilizzando una nuova istanza e un nuovo spazio di memoria, vediamo:
var buffer1 = new Buffer ("Content buffer numero 1, contenuto da copiare"); var buffer2 = nuovo Buffer (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); console.log (buffer2.toString());Come si vede creiamo due buffer differenti, dove il primo avrà il contenuto e il secondo avrà solo la dimensione, specifichiamo l'inizio per il nostro secondo buffer, e allo stesso modo indichiamo l'inizio e la fine per il nuovo buffer che copieremo, vediamo la risposta della console durante l'esecuzione dell'esempio:
Decodificare un buffer
Come abbiamo visto negli esempi precedenti, siamo stati in grado di stampare il contenuto originale del nostro buffer utilizzando il metodo accordare (), questo ciò che viene chiamato è la decodifica del buffer, dove come l'istanza della classe Respingente() se non specifichiamo nulla, per impostazione predefinita lo decodifichiamo in UTF-8.
Possiamo anche fare una transcodifica di una stringa UTF-8 a base64 per citare un caso, vediamo:
var stringutf8 = 'la mia nuova stringa'; var buf = nuovo Buffer (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);Infine vediamo come abbiamo transcodificato la nostra stringa originale:
Con questo finiamo questo tutorial in cui abbiamo imparato i modi per gestire i dati binari in Nodo.js grazie alla classe Respingente, che ci consente di manipolarlo dalla sua lettura, scrittura, ottenendone piccoli pezzi, copiandolo in nuove istanze e persino trasformando quel buffer in nuovi tipi di codifica per la sua manipolazione nei nostri programmi.