在Node.js里,字符串以UTF-8等编码表示文本,而二进制数据如图片、压缩包、网络协议包等并不能直接用字符串安全表达。Buffer类是Node.js提供的用于处理二进制数据的全局对象,它在V8堆外分配内存,可以存储任意字节序列。理解Buffer能够帮助我们正确处理文件、网络传输和加密等任务。

创建Buffer的几种方式
最常见的是通过 alloc 分配指定大小的缓冲区,或从字符串、数组转换而来。
// 分配长度为10字节的Buffer,内容初始化为0
const buf1 = Buffer.alloc(10);
// 从字符串创建,默认使用utf8编码
const buf2 = Buffer.from('你好', 'utf8');
// 从整数数组创建,每个数字对应一个字节
const buf3 = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
console.log(buf1.length); // 10
console.log(buf2.toString()); // 你好
console.log(buf3.toString()); // Hello
读取和写入数据
可以通过索引读写单个字节,也可以使用 write 方法在指定偏移写入字符串。
const buf = Buffer.alloc(12);
// 在偏移0处写入字符串
buf.write('hi', 0, 'utf8');
// 读取第一个字节
console.log(buf[0]); // 104,即字符h的ASCII码
// 从缓冲区读取字符串
console.log(buf.toString('utf8', 0, 2)); // hi
拼接与切片
处理流数据时常需要拼接多个Buffer,可以使用 Buffer.concat。切片则用 slice,注意切片与原Buffer共享内存。
const a = Buffer.from('AB');
const b = Buffer.from('CD');
const c = Buffer.concat([a, b]);
console.log(c.toString()); // ABCD
const part = c.slice(1, 3);
console.log(part.toString()); // BC
实际场景:读取图片文件
使用 fs 模块读取文件会得到Buffer,可直接发送给客户端或做进一步处理。
const fs = require('fs');
fs.readFile('/path/to/img.png', (err, data) => {
if (err) throw err;
// data就是图片的二进制Buffer
console.log('文件字节数:', data.length);
});
注意事项
- Buffer操作涉及字节,编码不对会导致乱码。
- 大Buffer会占用较多内存,流处理时建议分块读取。
- 不要用字符串拼接方式处理未知编码的二进制数据。
掌握Node.js的Buffer类,能够让你在处理二进制数据时更加稳妥高效,避免常见的编码与内存错误。