Node.js Buffer
Buffer 是 node.js 中的一个全局对象,专门用于处理二进制数据流。它类似于数组,但能够存储任意类型的数据(如整数、浮点数、字符串等),并且每个元素的大小固定为 1 字节(byte)。Buffer 在 Node.js 中应用广泛,特别是在处理网络流、文件操作和加密算法等场景中。
1. Buffer 的基本概念
Buffer 对象是由 C++ 代码实现的底层结构,而 JavaScript 代码则提供了一些高级的 API 来操作它。Buffer 的容量是固定的,一旦创建就不能改变。
2. 创建 Buffer
在 Node.js 中,可以通过多种方式创建 Buffer 对象:
Buffer.alloc(size[, fill[, encoding]]):分配一个指定大小的 Buffer 实例,并可选地用指定的值填充。如果未指定填充值,则默认填充为 0。
const buf = Buffer.alloc(10); // 创建一个长度为10的Buffer,并用0填充 console.log(buf); // <Buffer 00 00 00 00 00 00 00 00 00 00>
Buffer.allocUnsafe(size):分配一个指定大小的 Buffer 实例,但不会将其初始化为零。因此,新创建的 Buffer 实例可能会包含旧数据,使用时需要注意安全性。
const buf = Buffer.allocUnsafe(10); // 创建一个长度为10的Buffer,不保证内容为0 console.log(buf); // 内容可能不为全0
Buffer.from(array):通过一个字节数组创建一个新的 Buffer 实例。
const buf = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]); // 创建包含"hello"的Buffer console.log(buf.toString()); // hello
Buffer.from(string[, encoding]):创建一个包含字符串的 Buffer 实例。encoding 表示字符串的字符编码,如果未指定,则默认为 'utf8'。
const buf = Buffer.from('hello', 'utf8'); // 创建包含"hello"的Buffer console.log(buf); // <Buffer 68 65 6c 6c 6f>
Buffer.from(buffer):复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例。
3. 操作 Buffer
Buffer 类提供了许多属性和方法来操作二进制数据:
buf.length:返回 Buffer 的长度。
const buf = Buffer.from('hello'); console.log(buf.length); // 5
buf.toString([encoding[, start[, end]]])**:根据指定的编码将 Buffer 转换为字符串。start 和 end 参数用于指定要转换的 Buffer 范围。
const buf = Buffer.from('hello world'); console.log(buf.toString('utf8', 0, 5)); // hello
buf.write(string[, offset[, length]][, encoding])**:将字符串写入 Buffer。offset 是开始写入的索引值,length 是要写入的字节数,encoding 是使用的编码。
const buf = Buffer.alloc(10); buf.write('hello', 0, 5, 'utf8'); console.log(buf.toString('utf8', 0, 5)); // hello
buf.toJSON()**:返回 Buffer 的 JSON 表示。
const buf = Buffer.from('hello'); console.log(buf.toJSON()); // {"type":"Buffer","data":[104,101,108,108,111]}
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])**:将 Buffer 的一部分复制到另一个 Buffer。
const src = Buffer.from('hello world'); const dest = Buffer.alloc(5); src.copy(dest, 0, 0, 5); console.log(dest.toString()); // hello
buf.fill(value[, offset[, end]][, encoding])**:用指定值填充 Buffer。
const buf = Buffer.alloc(5); buf.fill(0xff); console.log(buf); // <Buffer ff ff ff ff ff>
buf.equals(otherBuffer)**:检查两个 Buffer 是否相等。
const buf1 = Buffer.from('hello'); const buf2 = Buffer.from('hello'); console.log(buf1.equals(buf2)); // true
buf.compare(otherBuffer)**:比较两个 Buffer 的字节顺序。返回值小于 0 表示 buf 在 otherBuffer 之前,等于 0 表示相等,大于 0 表示 buf 在 otherBuffer 之后。
const buf1 = Buffer.from('abc'); const buf2 = Buffer.from('def'); console.log(buf1.compare(buf2)); // -1
4. 注意事项
- 使用
Buffer.allocUnsafe()
创建的 Buffer 实例可能包含旧数据,因此在使用前需要确保其内容是安全的。 - 在处理来自不可信源的 Buffer 数据时,要格外小心,以避免潜在的安全风险。
- Buffer 是 Node.js 中特有的,不应该在浏览器环境中使用。
5. 示例代码
以下是一个简单的示例代码,演示了如何创建、操作和使用 Buffer:
// 创建一个长度为10的Buffer,并用0填充
const buf1 = Buffer.alloc(10);
console.log(buf1); // <Buffer 00 00 00 00 00 00 00 00 00 00>
// 创建一个包含字符串"hello"的Buffer
const buf2 = Buffer.from('hello');
console.log(buf2.toString()); // hello
// 使用write方法向Buffer写入数据
buf1.write('Node.js', 0, 6, 'utf8');
console.log(buf1.toString('utf8', 0, 6)); // Node.js
// 将Buffer转换为JSON对象
const json = JSON.stringify(buf2);
console.log(json); // {"type":"Buffer","data":[104,101,108,108,111]}
// 将JSON对象转换回Buffer
const buf3 = Buffer.from(JSON.parse(json).data);
console.log(buf3.toString()); // hello
通过掌握 Buffer 的创建和使用方法,你可以更好地处理 Node.js 中的二进制数据,特别是在文件操作、网络通信和加密算法等场景中。
本文地址:https://www.tides.cn/p_node-buffer