在 Node.js 中,Buffer
类是用来处理二进制数据流的,它允许你操作字节级别的数据。由于 JavaScript 语言本身没有原生的二进制数据类型,Buffer
类成为了在 Node.js 中处理二进制数据的重要工具。Buffer
实例类似于整数数组,但它对应的是 V8 堆内存之外的一块原始内存。
Buffer 的使用场景
- 处理 TCP 流或文件流时的二进制数据。
- 处理非 UTF-8 编码的文本数据。
- 处理图像、音频、视频等二进制文件。
创建 Buffer 实例
Node.js 提供了多种方式来创建 Buffer
实例:
// 使用 Buffer.alloc() 创建一个指定大小的 Buffer 实例,并用 0 填充
const buf1 = Buffer.alloc(10);
// 使用 Buffer.alloc() 创建一个指定大小并用特定值填充的 Buffer 实例
const buf2 = Buffer.alloc(10, 1); // 用 0x1 填充
// 使用 Buffer.allocUnsafe() 创建一个未初始化的 Buffer 实例
// 这种方式不推荐,因为它可能包含敏感数据
const buf3 = Buffer.allocUnsafe(10);
// 使用 Buffer.from() 从数组创建 Buffer 实例
const buf4 = Buffer.from([1, 2, 3]);
// 使用 Buffer.from() 从字符串创建 Buffer 实例
const buf5 = Buffer.from('tést');
// 使用 Buffer.from() 从字符串和指定编码创建 Buffer 实例
const buf6 = Buffer.from('tést', 'latin1');
Buffer 与字符编码
Buffer
实例通常用于表示特定编码的字符序列,例如 UTF-8、UCS2、Base64 或十六进制编码的数据。你可以通过指定字符编码在 Buffer
实例与 JavaScript 字符串之间进行转换。
// 创建一个包含字符串 'runoob' 的 Buffer 实例,使用 ascii 编码
const buf = Buffer.from('runoob', 'ascii');
// 将 Buffer 实例转换为十六进制字符串
console.log(buf.toString('hex')); // 输出:72756e6f6f62
// 将 Buffer 实例转换为 base64 编码的字符串
console.log(buf.toString('base64')); // 输出:cnVub29i
Node.js 支持的字符编码
ascii
- 7 位 ASCII 编码。utf8
- 多字节编码的 Unicode 字符。utf16le
- 2 或 4 个字节,小字节序编码的 Unicode 字符。ucs2
-utf16le
的别名。base64
- Base64 编码。latin1
- 一字节编码的字符串。binary
-latin1
的别名。hex
- 将每个字节编码为两个十六进制字符。
Buffer 的其他操作
Buffer
类还提供了许多其他操作,例如切片、比较、复制等。以下是一些示例:
// 创建一个 Buffer 实例
const buf = Buffer.from('Hello World', 'utf8');
// 切片操作,获取从索引 6 到 11 的部分
const slice = buf.slice(6, 11);
console.log(slice.toString()); // 输出:World
// 复制操作,将部分数据从一个 Buffer 实例复制到另一个
const copy = Buffer.alloc(10);
buf.copy(copy, 0, 0, 5);
console.log(copy.toString('utf8', 0, 5)); // 输出:Hello