Node.js Buffer 模块详解
Buffer 是 Node.js 中用于直接操作二进制数据的核心模块,它提供了一种处理原始内存分配和操作的方式,特别适用于处理 TCP 流、文件系统操作等 I/O 场景。
1. Buffer 基本概念
1.1 什么是 Buffer
Buffer 是一个表示固定长度的字节序列的全局对象,类似于整数数组,但对应于 V8 堆外部的固定大小的原始内存分配。它是 Node.js 处理二进制数据的主要方式。
1.2 为什么需要 Buffer
-
JavaScript 最初设计没有处理二进制数据的能力
-
处理网络协议、文件系统、图像处理等需要直接操作字节
-
比普通 JavaScript 数组更高效的内存管理
1.3 Buffer 与字符串的关系
-
Buffer 存储的是原始二进制数据
-
字符串是 UTF-8、UTF-16LE 等编码的字符序列
-
两者可以通过指定编码相互转换
2. 创建 Buffer
2.1 废弃的构造函数方式(不推荐)
// 已废弃的创建方式(Node.js v10 之前)
new Buffer(10); // 不安全,可能包含敏感数据
new Buffer('hello', 'utf-8');
2.2 推荐的创建方法
2.2.1 Buffer.alloc(size[, fill[, encoding]])
创建指定大小的 Buffer,并用 fill 值初始化(默认填充 0)
const buf1 = Buffer.alloc(10); // 创建10字节的Buffer,填充0
const buf2 = Buffer.alloc(10, 1); // 创建10字节的Buffer,填充1
const buf3 = Buffer.alloc(10, 'a', 'utf-8'); // 填充字符'a'
2.2.2 Buffer.allocUnsafe(size)
创建指定大小的 Buffer,但不初始化内容(可能包含旧数据)
const buf = Buffer.allocUnsafe(10); // 比alloc快,但不安全
2.2.3 Buffer.from()
从现有数据创建 Buffer
// 从数组创建
const buf1 = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
// 从字符串创建
const buf2 = Buffer.from('hello world', 'utf-8');
// 从已有Buffer创建副本
const buf3 = Buffer.from(buf2);
// 从ArrayBuffer创建
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
const buf4 = Buffer.from(arr.buffer);
2.2.4 Buffer.concat(list[, totalLength])
合并 Buffer 数组
const buf1 = Buffer.from('Hello');
const buf2 = Buffer.from(' ');
const buf3 = Buffer.from('World');
const concated = Buffer.concat([buf1, buf2, buf3]);
console.log(concated.toString()); // 'Hello World'
3. Buffer 操作
3.1 写入数据
3.1.1 buf.write(string[, offset[, length]][, encoding])
const buf = Buffer.alloc(10);
const bytesWritten = buf.write('hello', 2, 3, 'utf-8');
console.log(bytesWritten); // 3
console.log(buf); // <Buffer 00 00 68 65 6c 00 00 00 00 00>
3.1.2 其他写入方法
buf.fill(value[, offset[, end]][, encoding]) // 填充Buffer
buf.writeInt8(value, offset) // 写入8位有符号整数
buf.w