I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione. Per saperne di più.

Un buffer è una posizione specifica nella memoria non elaborata. Serve come spazio di archiviazione temporaneo per i dati binari in eccesso che l'unità di elaborazione non può accettare in quel particolare momento.

Node.js include una classe Buffer. Può gestire dati binari durante la gestione di flussi TCP (Transfer Control Protocol) e operazioni di lettura-scrittura su un file system.

Scopri come creare, leggere e modificare il contenuto di un buffer.

Creazione di un buffer

Per creare un Buffer in Node.js, utilizzerai il file alloc() O da() metodi. IL alloc() Il metodo crea un nuovo buffer, specificandone le dimensioni durante la creazione come primo e unico parametro richiesto. È utile quando non si hanno dati da archiviare al momento della creazione del buffer.

Specificare il parametro della dimensione del buffer in byte quando si crea un buffer con l'estensione alloc() metodo. Per esempio:

instagram viewer
cost buf = Buffer.alloc(8);
consolare.log (buf);
// produzione:

La classe Buffer aggiunge automaticamente zeri come valori segnaposto per i nuovi dati quando li crei con il alloc() metodo.

La classe Buffer esprime ogni valore 0 come 00, utilizzando il formato esadecimale. In questo esempio, contiene un totale di otto valori.

Per inizializzare il Buffer con valori segnaposto diversi, passare un secondo riempire parametro:

cost buf_filled = Buffer.alloc(8, 5);
consolare.log (buf_filled);
// produzione:

Questo oggetto cita una porzione di memoria che memorizza 8 byte del valore 05. Nota che sebbene tu abbia passato un numero come riempire parametro, i buffer memorizzano solo i dati in formato binario.

Dopo aver allocato la memoria nel Buffer, scrivere i dati chiamando il metodo scrivere() metodo:

cost buf = Buffer.alloc(8);

buf.write("v", "utf-8");
consolare.log (buf)
// produzione:

buf.write("va","utf-8");
consolare.log (buf)
// produzione:

IL scrivere() Il metodo utilizza la codifica dei caratteri per convertire il primo parametro, utilizzando utf-8 e poi scrive la stringa nel Buffer. L'aggiunta di un secondo carattere alla stringa riempirà il secondo byte.

Per estrarre dati da tipi di dati esistenti come stringhe o matrici, utilizzare il file da() metodo. Questo metodo crea buffer da stringhe e matrici.

Per esempio:

// Corda
cost stringBuf = Buffer.da('corda')
consolare.log (stringBuf)
// produzione:

// Vettore
cost arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'esadecimale')
consolare.log (arrayBuf);
// produzione:

IL da() Il metodo accetta l'input come primo parametro, calcola il numero di byte necessari per codificare i dati e quindi invia il risultato al Buffer. Fornendo un altro formato di codifica come secondo parametro, è possibile ignorare la codifica predefinita (UTF-8).

Passare i numeri al da() metodo genererà un errore.

Lettura di un buffer

Sebbene i buffer siano simili agli array, non sono ridimensionabili e possono essere gestiti dati informatici binari grazie ai metodi incorporati.

La classe Buffer ci consente di leggere singoli byte dei suoi dati utilizzando la sintassi delle parentesi quadre di JavaScript.

Per esempio:

cost mioBuf = Buffer.da('Mio');
consolare.tronco d'albero(MyBuf[1]);
// uscita: 105

consolare.tronco d'albero(MyBuf[3]);
// uscita: 101

consolare.tronco d'albero(MyBuf[5]);
// output: non definito

Il blocco di codice sopra utilizza la sintassi della parentesi quadra per ottenere i valori del primo e del terzo byte nella loro rappresentazione decimale. Il tentativo di ottenere un byte non valido comporterà un errore non definito errore.

Per accedere a tutti i suoi dati, la classe Buffer è dotata di metodi aJSON() E accordare(), che ottengono i contenuti in due diversi formati.

IL accordare() Il metodo emette una stringa come contenuto del buffer:

cost mioBuf = Buffer.da('Mio');
consolare.tronco d'albero(myBuf.accordare());
// output: 'Mio'

cost numeroBuf = Buffer.da([123]);
consolare.tronco d'albero(numeroBuf.accordare())
// produzione: '{'

cost vuotoBuf = Buffer.alloc(5);
consolare.tronco d'albero(vuotoBuf.accordare());
// output: '\\x00\\x00\\x00\\x00\\x00'

La prima chiamata inizializza il Buffer con il valore "Mio”, replicato dalla chiamata a toString. Il secondo esempio utilizza un array single-int per l'inizializzazione, che ha una rappresentazione di stringa come "{" carattere. Nel caso finale, un Buffer con cinque valori nulli restituisce la stringa "\x00\x00\x00\x00\x00”. La stringa \x00 è la rappresentazione esadecimale di null.

IL accordare() Il metodo emette sempre il risultato in formato stringa, indipendentemente dal tipo di dati con cui si inizializza il Buffer.

IL .toJSON() Il metodo restituisce la rappresentazione decimale dei dati del buffer, indipendentemente dai dati utilizzati per inizializzare il buffer.

Per esempio:

cost mioBuf = Buffer.da('Mio');
consolare.tronco d'albero(myBuf.toJSON());
// produzione: { tipo: 'Respingente', dati: [ 77, 105, 110, 101 ] }

L'output JSON ha un'estensione tipo immobile del valore di Respingente per indicarne l'origine. La sua proprietà data memorizza un array di decimali che rappresentano l'array di byte originale.

Modifica di un buffer

Analogamente all'accesso ai singoli byte di un Buffer, è anche possibile modificare i singoli byte del contenuto di un Buffer utilizzando la sintassi delle parentesi quadre.

Quando si utilizza la sintassi delle parentesi quadre per modificare un singolo contenuto, è possibile assegnare solo la rappresentazione decimale del valore.

Per esempio:

mioBuf[0] = 70
consolare.tronco d'albero(myBuf.accordare())
// output: 'Bene'

Poiché i buffer sono dati binari, non è possibile assegnare una stringa a una parte specifica di un buffer. Se provi a impostare un singolo byte su una stringa, Buffer lo tradurrà in un carattere nullo.

Per esempio:

mioBuf[0] = 'F';
consolare.tronco d'albero(myBuf.accordare());
// output: '\\x00ine'

In alternativa, è possibile modificare l'intero contenuto di un buffer utilizzando il file scrivere() metodo.

Prendi in considerazione l'inserimento di un indice al di fuori della lunghezza del Buffer. Anziché restituire un errore, Buffer ignora l'indice non valido e mantiene intatto il contenuto originale di Buffer.

Ad esempio, prova a impostare il quinto elemento di myBuf A R tramite la sua rappresentazione decimale di 114:

mioBuf[4] = 114;
consolare.tronco d'albero(myBuf.accordare());
// output: 'Mio'

Si noti che il accordare() metodo restituisce lo stesso valore 'Mio'.

Dal momento che non è possibile ridimensionare un buffer, il tentativo di scrivere più dati di quelli che si possono contenere comporterà l'eliminazione dei dati extra. Per esempio:

cost buf1 = Buffer.alloc(5)
buf1.write('numero');
consolare.tronco d'albero(buf1.accordare())
// output: 'numbe'

Usando il accordare() metodo per confermare i dati del buffer, restituisce 'numbe' piuttosto che 'numero'. Qual è l'argomento inserito all'interno del file scrivere() metodo.

I buffer scrivono in modo seriale a partire dall'indice zero. IL scrivere() Il metodo aggiunge serialmente byte a un buffer, sovrascrivendo qualsiasi dato precedente.

Per esempio:

cost buf2 = Buffer.alloc(6);

buf2.write('membro');
consolare.tronco d'albero(buff2.accordare())
// output: 'membro'

buf2.write('CIAO');
consolare.tronco d'albero(buff2.accordare());
// output: 'himber'

Il codice precedente crea un buffer di sei byte e aggiunge la stringa "membro" ad esso utilizzando il scrivere() metodo.

Quindi aggiorna il buffer con il nuovo contenuto che occupa meno spazio di memoria rispetto al contenuto precedente.

Ciò comporta la creazione di una nuova stringa con i primi due byte sovrascritti e i restanti byte lasciati inalterati.

Molte API e strutture dati utilizzano i buffer

Ora sai come creare un buffer, scriverne uno, leggerne il contenuto e modificarlo con i metodi appropriati.

Sono disponibili molti altri metodi per lavorare con la classe Node.js Buffer.

Dovresti conoscere questi metodi e comprendere i buffer per capire come funzionano concetti diversi come flussi e file system.