JavaScript es bueno para manejar cadenas, pero debido a que originalmente fue diseñado para manejar documentos HTML, no es muy bueno para manejar datos binarios. JavaScript no tiene tipo de byte, ni tipos estructurados e incluso matrices de bytes, solo números y cadenas. (Texto original: JavaScript no tiene un tipo de byte: solo tiene números, o tipos estructurados, o http://skylitecellars.com/ incluso matrices de bytes: solo tiene cadenas).
Debido a que Node se basa en JavaScript, puede manejar naturalmente los protocolos de texto como HTTP, pero también puede usarlo para interactuar con bases de datos, imágenes de procesos o cargas de archivos, etc. Es concebible lo difícil que sería hacer estas cosas con solo cuerdas. Anteriormente, Node manejaba los datos binarios al codificar el byte en caracteres de texto, pero este método luego resultó inviable, desperdiciando recursos, lento, inflexible y difícil de mantener.
Node tiene un búfer de implementación de búfer binario. Esta pseudo clase proporciona una serie de API para procesar datos binarios, simplificando tareas que requieren procesar datos binarios. La longitud del búfer se determina por la longitud de los datos de bytes, y puede establecer y obtener los datos de byte en el búfer.
Nota: La clase de búfer tiene un lugar especial. La memoria ocupada por los datos de bytes en el búfer no se asigna en JavasCRP.
Es un montón de memoria VM, es decir, estos objetos no serán procesados por el algoritmo de recolección de basura de JavaScript, y serán reemplazados por una dirección de memoria permanente que no se modificará, lo que también evita los desechos de la CPU causados por la copia de la memoria del contenido tamponado.
Crear un búfer
Puede crear un búfer con una cadena UTF-8 como esta:
La copia del código es la siguiente:
var buf = new Buffer ('¡Hola mundo!');
También puede crear un búfer con una codificación especificada:
La copia del código es la siguiente:
var buf = new Buffer ('8B76FDE713CE', 'Base64');
La codificación e identificación de caracteres aceptable es la siguiente:
1.Ascii-Aasci, solo aplicable a los conjuntos de caracteres ASCII.
2.Utf8-UTF-8, esta codificación de toda la variable es adecuada para cualquier carácter en el conjunto de caracteres Unicode. Se ha convertido en la codificación preferida en el mundo web y también es el tipo de codificación predeterminado de nodo.
3.Base64 - Base64, esta codificación se basa en 64 caracteres ASCII imprimibles para representar datos binarios. Base64 generalmente se usa para incrustar datos binarios que se pueden convertir en cadenas en un documento de caracteres, y se pueden convertir nuevamente en el formato binario original intacto y sin pérdidas cuando sea necesario.
Si no hay datos para inicializar el búfer, puede crear un búfer vacío con el tamaño de capacidad especificado:
La copia del código es la siguiente:
var buf = new Buffer (1024); // crear un búfer de 1024 bytes
Obtenga y establezca datos almacenados en búfer
Después de crear o recibir un objeto amortiguado, es posible que desee ver o modificar su contenido. Puede acceder a un cierto byte del búfer a través del operador []:
La copia del código es la siguiente:
var buf = new Buffer ('mi contenido de búfer');
// Acceda al décimo byte en el búfer
console.log (buf [10]); // -> 99
Nota: Cuando cree un búfer inicializado (usando el tamaño de la capacidad del búfer), asegúrese de tener en cuenta que los datos almacenados no se inicializan a 0, sino que son datos aleatorios.
La copia del código es la siguiente:
var buf = new Buffer (1024);
console.log (buf [100]); // -> 5 (algún valor aleatorio)
Puede modificar los datos en cualquier lugar del búfer como este:
La copia del código es la siguiente:
BUF [99] = 125; // Establecer el valor del 100 byte en 125
Nota: En algunos casos, algunas operaciones de amortiguación no producen errores, como:
1. El valor máximo de los bytes en el búfer es 255. Si un byte se le asigna un número mayor que 256, se modulará con 256 y luego asignará el resultado a este byte.
2. Si se asigna un byte amortiguado a 256, su valor real será 0 (nota del traductor: en realidad se repite con el primero, 256%256 = 0)
3. Si usa un número de punto flotante para asignar un valor a un byte en el búfer, como 100.7, el valor real será la parte entera del número de punto flotante - 100
4. Si intenta asignar un valor a una posición que excede la capacidad del búfer, la operación de asignación fallará y el búfer no se modificará.
Puede usar el atributo de longitud para obtener la longitud del búfer:
La copia del código es la siguiente:
var buf = nuevo búfer (100);
console.log (buf.length); // -> 100
También puede iterar sobre los contenidos amortiguados usando la longitud del búfer para leer o configurar cada byte:
La copia del código es la siguiente:
var buf = nuevo búfer (100);
para (var i = 0; i <buf.length; i ++) {
buf [i] = i;
}
El código anterior crea un nuevo búfer que contiene 100 bytes y establece cada byte en el búfer de 0 a 99.
Datos de corte en busca de buffer
Una vez que se crea o recibe un búfer, es posible que deba extraer una parte de los datos almacenados. Puede dividir el búfer existente especificando la posición inicial para crear otro búfer más pequeño:
La copia del código es la siguiente:
var buffer = new Buffer ("Este es el contenido de mi búfer");
var más pequeñoBuffer = buffer.slice (8, 19);
console.log (más pequeñoBuffer.ToString ()); // -> "El contenido"
Tenga en cuenta que al dividir un búfer, no se asigna o copia ninguna memoria nueva. El nuevo búfer utiliza la memoria del búfer principal, que es solo una referencia a un determinado datos (especificados por la posición inicial). Este pasaje tiene varios significados.
Primero, si su programa modifica el contenido del amortiguador principal, estas modificaciones también afectarán los buffers infantiles relevantes, porque el búfer y el búfer de los niños son objetos de JavaScript diferentes, por lo que es fácil ignorar este problema y conducir a algunos posibles errores.
En segundo lugar, cuando crea un búfer infantil más pequeño del amortiguador principal de esta manera, el objeto de amortiguación principal aún se conservará después de que se termine la operación y no se recolecte basura. Si no tiene cuidado, causará fácilmente la fuga de memoria.
Nota: Si le preocupa la fuga de memoria, puede usar el método de copia en lugar de la operación de corte. Lo siguiente introducirá copia.
Copiar datos almacenados en búfer
Puede usar Copy para copiar una parte del búfer a otro búfer como este:
La copia del código es la siguiente:
var buffer1 = new Buffer ("Este es el contenido de mi búfer");
var buffer2 = nuevo búfer (11);
var TargetStart = 0;
var SourCeStart = 8;
VAR Sourceend = 19;
buffer1.copy (Buffer2, TargetStart, SourCeStart, SourceEd);
console.log (buffer2.ToString ()); // -> "El contenido"
En el código anterior, copie los bytes del 9 al 20 del búfer de origen a la posición de inicio del búfer de destino.
Datos de decodificación de topes de decodificación
Los datos almacenados se pueden convertir en una cadena UTF-8 como esta:
La copia del código es la siguiente:
var str = buf.ToString ();
Los datos almacenados también se pueden decodificar en cualquier datos de tipo de codificación especificando el tipo de codificación. Por ejemplo, si desea decodificar un búfer en una cadena Base64, puede hacer esto:
La copia del código es la siguiente:
var b64str = buf.ToString ("base64");
Usando la función ToString, también puede transcodificar una cadena UTF-8 en una cadena Base64:
La copia del código es la siguiente:
var utf8String = 'mi cadena';
var buf = new Buffer (UTF8String);
var base64String = buf.ToString ('base64')
resumen
A veces tiene que lidiar con los datos binarios, pero JavaScript nativo no tiene una forma clara de hacerlo, por lo que Node proporciona una clase de búfer que encapsula algunas operaciones para bloques de memoria continuos. Puede dividir o copiar datos de memoria entre dos buffers.
También puede convertir un búfer en algún tipo de cadena codificada, o a su vez, convertir una cadena en un búfer para acceder o procesar cada bit.