O JavaScript é bom para lidar com seqüências de caracteres, mas como foi originalmente projetado para lidar com documentos HTML, não é muito bom para lidar com dados binários. O JavaScript não possui tipo de bytes, tipos estruturados e até mesmo matrizes de bytes, apenas números e strings. (Texto original: JavaScript não possui um tipo de byte - apenas tem números - ou tipos estruturados, ou http://skylitecellars.com/ mesmo matrizes de bytes: apenas tem strings.)
Como o nó é baseado no JavaScript, ele pode lidar naturalmente protocolos de texto como o HTTP, mas você também pode usá -lo para interagir com bancos de dados, imagens de processo ou uploads de arquivos, etc. É concebível o quão difícil seria fazer essas coisas com apenas strings. Anteriormente, os dados binários lidados com o Node codificando byte em caracteres de texto, mas esse método mais tarde se mostrou inviável, desperdiçando recursos, lento, inflexível e difícil de manter.
O Node possui um buffer de implementação de buffer binário. Esta pseudo-classe fornece uma série de APIs para processar dados binários, simplificando tarefas que exigem dados binários de processamento. O comprimento do buffer é determinado pelo comprimento dos dados de bytes e você pode definir e obter os dados de bytes aleatoriamente no buffer.
Nota: A classe Buffer tem um lugar especial. A memória ocupada pelos dados de bytes no buffer não é alocada no JavaSCRP.
Ele vm heap, ou seja, esses objetos não serão processados pelo algoritmo de coleta de lixo do JavaScript e serão substituídos por um endereço de memória permanente que não será modificado, o que também evita os resíduos da CPU causados pela cópia de memória de conteúdo tamponado.
Crie um buffer
Você pode criar um buffer com uma string UTF-8 como esta:
A cópia do código é a seguinte:
var BUF = new Buffer ('Hello World!');
Você também pode criar um buffer com uma codificação especificada:
A cópia do código é a seguinte:
var buf = new Buffer ('8b76fde713ce', 'base64');
A codificação e identificação de caracteres aceitáveis são as seguintes:
1.ASCII-ASCI, aplicável apenas aos conjuntos de caracteres ASCII.
2.utf8-UTF-8, essa codificação em todo o mundo é adequada para qualquer caractere no conjunto de caracteres Unicode. Tornou -se a codificação preferida no mundo da web e também é o tipo de nó de codificação padrão.
3.Base64 - Base64, essa codificação é baseada em 64 caracteres ASCII imprimíveis para representar dados binários. Base64 é geralmente usado para incorporar dados binários que podem ser convertidos em strings em um documento de caracteres e podem ser convertidos de volta ao formato binário original intacto e sem perdas quando necessário.
Se não houver dados para inicializar o buffer, você poderá criar um buffer vazio com o tamanho da capacidade especificado:
A cópia do código é a seguinte:
var buf = novo buffer (1024); // Crie um buffer de 1024 bytes
Obtenha e defina dados em buffer
Depois de criar ou receber um objeto em buffer, convém visualizar ou modificar seu conteúdo. Você pode acessar um certo byte do buffer através do operador []:
A cópia do código é a seguinte:
var BUF = new Buffer ('meu conteúdo do buffer');
// Acesse o 10º byte no buffer
console.log (BUF [10]); // -> 99
Nota: Quando você cria um buffer inicializado (usando o tamanho da capacidade do buffer), observe que os dados em buffer não são inicializados para 0, mas são dados aleatórios.
A cópia do código é a seguinte:
var buf = novo buffer (1024);
console.log (BUF [100]); // -> 5 (algum valor aleatório)
Você pode modificar os dados em qualquer lugar do buffer como este:
A cópia do código é a seguinte:
BUF [99] = 125; // Defina o valor do 100º byte a 125
Nota: Em alguns casos, algumas operações de buffer não produzem erros, como:
1. O valor máximo de bytes no buffer é 255. Se um byte for atribuído um número maior que 256, ele será modulado com 256 e atribuirá o resultado a este byte.
2. Se um byte em buffer for atribuído a 256, seu valor real será 0 (Nota do tradutor: na verdade é repetido com o primeiro, 256%256 = 0)
3. Se você usar um número de ponto flutuante para atribuir um valor a um byte no buffer, como 100,7, o valor real será a parte inteira do número de ponto flutuante - 100
4. Se você tentar atribuir um valor a uma posição que exceda a capacidade do buffer, a operação de atribuição falhará e o buffer não será modificado.
Você pode usar o atributo de comprimento para obter o comprimento do buffer:
A cópia do código é a seguinte:
var buf = novo buffer (100);
console.log (buf.length); // -> 100
Você também pode iterar sobre o conteúdo tamponado usando o comprimento do buffer para ler ou definir cada byte:
A cópia do código é a seguinte:
var buf = novo buffer (100);
for (var i = 0; i <buf.length; i ++) {
buf [i] = i;
}
O código acima cria um novo buffer contendo 100 bytes e define cada byte no buffer de 0 a 99.
Fatiar dados em buffer
Depois que um buffer é criado ou recebido, pode ser necessário extrair uma parte dos dados em buffer. Você pode dividir o buffer existente especificando a posição inicial para criar outro buffer menor:
A cópia do código é a seguinte:
var buffer = new buffer ("Este é o conteúdo do meu buffer");
var menorbuffer = buffer.slice (8, 19);
console.log (SMLATERBUFFER.ToString ()); // -> "o conteúdo"
Observe que, ao dividir um buffer, nenhuma nova memória é alocada ou copiada. O novo buffer usa a memória do buffer pai, que é apenas uma referência a uma determinada peça de dados (especificada pela posição inicial). Esta passagem tem vários significados.
Primeiro, se o seu programa modificar o conteúdo do buffer pai, essas modificações também afetarão os buffers filhos relevantes, porque o buffer pai e o buffer filho são objetos JavaScript diferentes, por isso é fácil ignorar esse problema e levar a alguns bugs em potencial.
Em segundo lugar, quando você cria um buffer filho menor do buffer pai dessa maneira, o objeto de buffer pai ainda será retido após a conclusão da operação e não será coletada de lixo. Se você não tomar cuidado, isso causará facilmente vazamento de memória.
NOTA: Se você estiver preocupado com o vazamento de memória, poderá usar o método de cópia em vez da operação da fatia. O seguinte introduzirá cópia.
Copiar dados em buffer
Você pode usar cópia para copiar uma parte do buffer para outro buffer como este:
A cópia do código é a seguinte:
var buffer1 = new buffer ("Este é o conteúdo do meu buffer");
var buffer2 = novo buffer (11);
var TargetStart = 0;
var SourCestart = 8;
var sourcend = 19;
Buffer1.copy (Buffer2, TargetStart, SourCestart, SourceEnd);
console.log (buffer2.toString ()); // -> "o conteúdo"
No código acima, copie o 9º a 20º bytes do buffer de origem para a posição inicial do buffer de destino.
Decodificar dados em buffer
Os dados em buffer podem ser convertidos em uma string UTF-8 como esta:
A cópia do código é a seguinte:
var str = buf.toString ();
Os dados em buffer também podem ser decodificados em qualquer tipo de tipo de codificação especificando o tipo de codificação. Por exemplo, se você deseja decodificar um buffer em uma string base64, poderá fazer isso:
A cópia do código é a seguinte:
var b64str = buf.toString ("base64");
Usando a função ToString, você também pode transcodificar uma string UTF-8 em uma string base64:
A cópia do código é a seguinte:
var utf8string = 'minha string';
var BUF = new Buffer (UTF8String);
var base64string = buf.toString ('base64')
resumo
Às vezes, você precisa lidar com dados binários, mas o JavaScript nativo não tem uma maneira clara de fazer isso, portanto, o Node fornece uma classe buffer que encapsula algumas operações para blocos de memória contínua. Você pode dividir ou copiar dados de memória entre dois buffers.
Você também pode converter um buffer em algum tipo de string codificada ou, por sua vez, converter uma string em um buffer para acessar ou processar cada bit.