Un búfer es una ubicación específica en la memoria sin formato. Sirve como un espacio de almacenamiento temporal para el exceso de datos binarios que la unidad de procesamiento no puede aceptar en ese momento en particular.
Node.js incluye una clase Buffer. Puede manejar datos binarios al administrar transmisiones TCP (Protocolo de control de transferencia) y operaciones de lectura y escritura en un sistema de archivos.
Aprenda a crear, leer y cambiar el contenido de un búfer.
Creación de un búfer
Para crear un búfer en Node.js, utilizará el asignar() o de() métodos. El asignar() El método crea un nuevo búfer, especificando su tamaño durante la creación como el primer y único parámetro requerido. Es útil cuando no tiene ningún dato para almacenar en el momento de la creación del búfer.
Especifique el parámetro de tamaño de búfer en bytes cuando cree un búfer con el asignar() método. Por ejemplo:
constante buf = Buffer.alloc(8);
consola.registro (buf);
// producción:
La clase Buffer agrega automáticamente ceros como valores de marcador de posición para nuevos datos cuando los crea con el asignar() método.
La clase Buffer expresa cada valor 0 como 00, usando formato hexadecimal. En este ejemplo, contiene un total de ocho valores.
Para inicializar el búfer con diferentes valores de marcador de posición, pase un segundo llenar parámetro:
constante buf_llenado = Buffer.alloc(8, 5);
consola.log (buf_llenado);
// producción:
Este objeto cita una parte de la memoria que almacena 8 bytes del valor 05. Tenga en cuenta que aunque pasó un número como el llenar parámetro, los búferes solo almacenan datos en binario.
Después de asignar memoria al búfer, escriba los datos llamando al escribir() método:
constante buf = Buffer.alloc(8);
buf.escribir("v", "utf-8");
consola.log (buf)
// producción:
buf.escribir("Virginia","utf-8");
consola.log (buf)
// producción:
El escribir() método utiliza la codificación de caracteres para convertir el primer parámetro, utilizando utf-8 y luego escribe la cadena en el búfer. Agregar un segundo carácter a la cadena llenará el segundo byte.
Para extraer datos de tipos de datos existentes como cadenas o matrices, use el de() método. Este método crea búferes a partir de cadenas y matrices.
Por ejemplo:
// Cadena
constante stringBuf = Buffer.from('cadena')
consola.log (cadenaBuf)
// producción:
// matriz
constante arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'maleficio')
consola.log (arrayBuf);
// producción:
El de() El método toma la entrada como su primer parámetro, calcula la cantidad de bytes que necesita para codificar los datos y luego envía el resultado al búfer. Al proporcionar otro formato de codificación como segundo parámetro, puede anular la codificación predeterminada (UTF-8).
Pasar números a la de() método dará como resultado un error.
Lectura de un búfer
Aunque los búferes son similares a las matrices, no se pueden cambiar de tamaño y pueden tratar con datos informáticos binarios gracias a los métodos incorporados.
La clase Buffer nos permite leer bytes individuales de sus datos utilizando la sintaxis de corchetes de JavaScript.
Por ejemplo:
constante myBuf = Buffer.from('Mío');
consola.registro(Mi Buf[1]);
// salida: 105consola.registro(Mi Buf[3]);
// salida: 101
consola.registro(Mi Buf[5]);
// salida: indefinido
El bloque de código anterior emplea la sintaxis de corchetes para obtener los valores del primer y tercer byte en su representación decimal. Intentar obtener un byte no válido resultará en un indefinido error.
Para acceder a todos sus datos, la clase Buffer viene con métodos aJSON() y Encadenar(), que obtienen los contenidos en dos formatos diferentes.
El Encadenar() El método genera una cadena como el contenido del búfer:
constante myBuf = Buffer.from('Mío');
consola.registro(miBuf.Encadenar());
// salida: 'Mío'constante numberBuf = Buffer.from([123]);
consola.registro(númeroBuf.Encadenar())
// producción: '{'
constante vacíoBuf = Buffer.alloc(5);
consola.registro(vacíoBuf.Encadenar());
// salida: '\\x00\\x00\\x00\\x00\\x00'
La primera llamada inicializa el Buffer con el valor “Mío”, que replica la llamada a toString. El segundo ejemplo utiliza una matriz de un solo int para la inicialización, que tiene una representación de cadena como "{" personaje. En el último caso, un Buffer con cinco valores nulos devuelve la cadena “\x00\x00\x00\x00\x00”. La cuerda \x00 es la representación hexadecimal de nulo.
El Encadenar() El método siempre genera el resultado en formato de cadena, sin importar con qué tipo de datos inicialice el búfer.
El .toJSON() El método devuelve la representación decimal de los datos del búfer, independientemente de los datos que utilizó para inicializar el búfer.
Por ejemplo:
constante myBuf = Buffer.from('Mío');
consola.registro(miBuf.toJSON());
// producción: { tipo: 'Buffer', datos: [ 77, 105, 110, 101 ] }
La salida JSON tiene un tipo propiedad con un valor de Buffer para indicar su origen. Su propiedad de datos almacena una matriz de decimales que representan la matriz de bytes original.
Modificación de un búfer
De manera similar a acceder a los bytes individuales de un búfer, también puede modificar bytes individuales del contenido de un búfer utilizando la sintaxis de corchetes.
Al usar la sintaxis de corchetes para cambiar un contenido individual, solo puede asignar la representación decimal del valor.
Por ejemplo:
miBuf[0] = 70
consola.registro(miBuf.Encadenar())
// salida: 'Bien'
Debido a que los búferes son datos binarios, no puede dar una cadena a una porción específica de un búfer. Si intenta establecer un byte individual en una cadena, Buffer lo traducirá a un carácter nulo.
Por ejemplo:
miBuf[0] = 'F';
consola.registro(miBuf.Encadenar());
// salida: '\\x00ine'
Alternativamente, puede cambiar todo el contenido de un búfer usando el escribir() método.
Considere insertar un índice fuera de la longitud del búfer. En lugar de devolver un error, Buffer ignora el índice no válido y mantiene intacto el contenido original de Buffer.
Por ejemplo, trate de establecer el quinto elemento de miBuf a r a través de su representación decimal de 114:
miBuf[4] = 114;
consola.registro(miBuf.Encadenar());
// salida: 'Mío'
Note que el Encadenar() método devuelve el mismo valor 'Mío'.
Dado que no puede cambiar el tamaño de un búfer, intentar escribir más datos de los que uno puede contener hará que descarte los datos adicionales. Por ejemplo:
constante buf1 = Buffer.alloc(5)
buf1.escribir('número');
consola.registro(buf1.Encadenar())
// salida: 'numero'
Utilizando el Encadenar() método para confirmar los datos del búfer, devuelve 'entumecido' en vez de 'número'. ¿Cuál es el argumento insertado dentro del escribir() método.
Los búferes escriben en forma serial comenzando en el índice cero. El escribir() El método agrega bytes en serie a un búfer, sobrescribiendo cualquier dato anterior.
Por ejemplo:
constante buf2 = Buffer.alloc(6);
buf2.escribir('miembro');
consola.registro(buf2.Encadenar())
// salida: 'miembro'
buf2.escribir('Hola');
consola.registro(buf2.Encadenar());
// salida: 'himber'
El código anterior crea un búfer de seis bytes y agrega la cadena "miembro" a ello usando el escribir() método.
Luego actualiza el búfer con contenido nuevo que ocupa menos espacio de memoria que el contenido anterior.
Esto da como resultado la creación de una nueva cadena con los dos primeros bytes sobrescritos y los bytes restantes sin modificar.
Muchas API y estructuras de datos utilizan búferes
Ahora sabe cómo crear un búfer, escribir en uno, leer su contenido y modificarlo con los métodos apropiados.
Hay varios otros métodos disponibles para trabajar con la clase Buffer de Node.js.
Debe conocer estos métodos y comprender los búferes para comprender cómo funcionan los diferentes conceptos, como flujos y sistemas de archivos.