Node 中的 Buffer
在 Node 应⽤中,需要处理⽹络协议、操作数据库、处理图⽚、接收上传⽂件等,在⽹络流和⽂件的
操作中,要处理⼤量⼆进制数据,⽽ Buffer 就是在内存中开辟⼀⽚区域(初次初始化为8KB),⽤
来存放⼆进制数据
在上述操作中都会存在数据流动,每个数据流动的过程中,都会有⼀个最⼩或最⼤数据量
如果数据到达的速度⽐进程消耗的速度快,那么少数早到达的数据会处于等待区等候被处理。反之,
如果数据到达的速度⽐进程消耗的数据慢,那么早先到达的数据需要等待⼀定量的数据到达之后才能
被处理
这⾥的等待区就指的缓冲区(Buffer),它是计算机中的⼀个⼩物理单位,通常位于计算机的 RAM
中
简单来讲, Nodejs 不能控制数据传输的速度和到达时间,只能决定何时发送数据,如果还没到发送
时间,则将数据放在 Buffer 中,即在 RAM 中,直⾄将它们发送完毕
Buffer 类在全局作⽤域中,⽆须 require 导⼊
创建 Buffer 的⽅法有很多种,我们讲讲下⾯的两种常⻅的形式:
•
Buffer.from()
•
Buffer.alloc()
3.2.1. Buffer.from()
const b1 = Buffer.from(‘10’);
const b2 = Buffer.from(‘10’, ‘utf8’);
const b3 = Buffer.from([10]);
const b4 = Buffer.from(b3);
console.log(b1, b2, b3, b4); // <Buffer 31 30> <Buffer 31 30> <Buffer 0a>
<Buffer 0a>
1
2
3
4
5
3.2.2. Buffer.alloc()
const bAlloc1 = Buffer.alloc(10); // 创建⼀个⼤⼩为 10 个字节的缓冲区
const bAlloc2 = Buffer.alloc(10, 1); // 建⼀个⻓度为 10 的 *Buffer,*其中全部填充了值
为
1
的字节
console.log(bAlloc1); // <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(bAlloc2); // <Buffer 01 01 01 01 01 01 01 01 01 01>
1
2
3
4
5
6
在上⾯创建 buffer 后,则能够 toString 的形式进⾏交互,默认情况下采取 utf8 字符编码形
式,如下const buffer = Buffer.from(“你好”);
console.log(buffer);
//
const str = buffer.toString();
console.log(str);
// 你好
如果编码与解码不是相同的格式则会出现乱码的情况,如下:
const buffer = Buffer.from(“你好”,”utf-8 “);
console.log(buffer);
//
const str = buffer.toString(“ascii”);
console.log(str);
// d= e%=
当设定的范围导致字符串被截断的时候,也会存在乱码情况,如下:
const buf = Buffer.from(‘Node.js 技术栈’, ‘UTF-8’);
console.log(buf) // <Buffer 4e 6f 64 65 2e 6a 73 20 e6 8a 80 e6 9c af
e6 a0 88>
console.log(buf.length) // 17
console.log(buf.toString(‘UTF-8’, 0, 9)) // Node.js
console.log(buf.toString(‘UTF-8’, 0, 11)) // Node.js 技
所⽀持的字符集有如下:
•
ascii:仅⽀持 7 位 ASCII 数据,如果设置去掉⾼位的话,这种编码是⾮常快的
•
utf8:多字节编码的 Unicode 字符,许多⽹⻚和其他⽂档格式都使⽤ UTF-8
•
utf16le:2 或 4 个字节,⼩字节序编码的 Unicode 字符,⽀持代理对(U+10000⾄ U+10FFFF)
•
ucs2,utf16le 的别名
•
base64:Base64 编码
•
latin:⼀种把 Buffer 编码成⼀字节编码的字符串的⽅式
•
binary:latin1 的别名,
•
hex:将每个字节编码为两个⼗六进制字符



