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:将每个字节编码为两个⼗六进制字符