Buffer缓冲区
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型,所以Buffer就是用来存储二进制文件的。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象
Buffer 与字符编码
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。
在缓冲区和字符串之间进行转换时,可以指定字符编码。如果没有指定字符编码,将使用UTF-8作为默认值。
const buf = Buffer.from('runoob', 'ascii');
// 输出 72756e6f6f62
console.log(buf.toString('hex'));
// 输出 cnVub29i
console.log(buf.toString('base64'));
Node.js 目前支持的字符编码包括:
-
ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
-
utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
-
utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
-
ucs2 - utf16le 的别名。
-
base64 - Base64 编码。
-
latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。
-
binary - latin1 的别名。
-
hex - 将每个字节编码为两个十六进制字符。
Buffer 使用
直接使用不需要引入模块,直接使用即可。
Buffer
类是一个全局变量,用于直接处理二进制数据。 它可以使用多种方式构建。
Buffer.from(array)#
新增于: v5.10.0
array
<integer[]>
使用 0
– 255
范围内的字节数组 array
来分配一个新的 Buffer
。 超出该范围的数组条目会被截断以适合它。
// 创建一个包含字符串 'buffer' 的 UTF-8 字节的新 Buffer。
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
如果 array
不是一个 Array
或适用于 Buffer.from()
变量的其他类型,则抛出 TypeError
。
Buffer.from(array)
和 Buffer.from(string)
也可以像 Buffer.allocUnsafe()
一样使用内部的 Buffer
池。
Buffer.alloc(size[, fill[, encoding]])
size
<integer> 新Buffer
的所需长度。fill
<string> | <Buffer> | <Uint8Array> | <integer> 用于预填充新Buffer
的值。默认值:0
。encoding
<string> 如果fill
是一个字符串,则这是它的字符编码。默认值:'utf8'
。
const b = Buffer.alloc(10,"李连杰","utf8");
console.log(b.toString());
Buffer.allocUnsafe(size)
size
<integer> 新建的Buffer
的长度。
创建一个大小为 size
字节的新 Buffer
。 如果 size
大于 buffer.constants.MAX_LENGTH
或小于 0,则抛出 ERR_INVALID_OPT_VALUE
。
以这种方式创建的 Buffer
实例的底层内存是未初始化的。 新创建的 Buffer
的内容是未知的,可能包含敏感数据。 使用 Buffer.alloc()
可以创建以零初始化的 Buffer
实例。
const buf = Buffer.allocUnsafe(10);
console.log(buf);
// 打印(内容可能有所不同): <Buffer a0 8b 28 3f 01 00 00 00 50 32>
buf.fill(0);
console.log(buf);
// 打印: <Buffer 00 00 00 00 00 00 00 00 00 00>
对比Buffer.alloc(size[, fill[, encoding]])和Buffer.allocUnsafe(size)
alloc:安全,效率低
allocUnsafe:不安全,效率高,会泄露敏感信息。