node Buffer作用与常用方法
下面给你 Node.js Buffer 的作用 + 核心原理 + 最常用方法,全部经过整理,清晰易懂、适合面试 + 实战。
🟦 一、Buffer 的作用(最核心)
Buffer = Node.js 的二进制数据容器(堆外内存)
JavaScript(浏览器)原本只支持字符串,不支持二进制。
Node.js 是服务器,需要处理:
-
TCP/UDP 二进制数据包
-
文件读写(图片、视频、zip、音频)
-
图片、PDF、加密字节流
-
二进制协议(如 protobuf)
-
Base64、Hex 转换
-
原生扩展(C++ Addon)交互
所以 Node.js 内部实现了 Buffer 来处理二进制。
特点:
-
存储在 堆外内存(不是 V8 堆),不会被 JS 限制
-
高性能,适合 IO 操作
-
基于
Uint8Array扩展 -
单位是 字节(0~255)
🟦 二、Buffer 的常用场景
-
文件 IO
const fs = require('fs');
const buf = fs.readFileSync('a.png'); // 返回 Buffer
-
网络数据包(TCP)
socket.on('data', (buf) => {
console.log(buf); // Buffer
});
-
编码转换(utf8/hex/base64)
let b64 = Buffer.from('hello').toString('base64');
-
二进制协议解析
buf.readUInt32BE(0);
-
操作图片、音频、加密数据等
🟦 三、Buffer 常用方法(极简 + 实战排序)
下面按开发中最常用、最实战的顺序整理👇
✅ 1. 创建 Buffer
✔️ Buffer.from()
创建已有数据的 buffer(最常用)。
Buffer.from('hello'); // 字符串
Buffer.from([0x11, 0x22, 0x33]); // 字节数组
Buffer.from('68656c6c6f', 'hex'); // hex
✔️ Buffer.alloc(size)
创建一个指定大小的 buffer(安全填 0)。
Buffer.alloc(10);
✔️ Buffer.allocUnsafe(size)
更快但不安全(可能含旧内存),通常用来提高性能。
Buffer.allocUnsafe(10);
✅ 2. 读写字符串
✔️ 读取
buf.toString('utf8');
buf.toString('hex');
buf.toString('base64');
✔️ 写入
buf.write("hello", 0, "utf8");
✅ 3. 直接操作字节
✔️ 访问单个字节
console.log(buf[0]);
buf[1] = 255;
✅ 4. Buffer 拼接与切片
✔️ Buffer.concat()
拼接多个 Buffer(网络拼包最常用)
Buffer.concat([buf1, buf2]);
✔️ buf.slice(start, end)
切片(共享内存)
const part = buf.slice(0, 4);
✔️ buf.copy()
复制到另一块新内存(不共享)
buf.copy(target, 0, 0, 5);
✅ 5. 填充 / 判断 / 比较
✔️ 填充
buf.fill(0);
buf.fill(0xff);
✔️ 判断是否 Buffer
Buffer.isBuffer(buf);
✔️ 比较两个 Buffer
buf1.equals(buf2);
✔️ 排序比较
Buffer.compare(buf1, buf2);
✅ 6. 读写整数(处理二进制协议最重要)
✔️ 写整数
buf.writeUInt8(255, 0);
buf.writeUInt16BE(1000, 1);
buf.writeUInt32LE(500000, 3);
✔️ 读整数
buf.readUInt8(0);
buf.readUInt16BE(1);
buf.readUInt32LE(3);
大端(BE)和小端(LE)取决于协议设计。
🟦 四、总结(最核心 10 条)
| 分类 | 最常用方法 |
|---|---|
| 创建 | from, alloc, allocUnsafe |
| 编码转换 | toString(utf8/hex/base64) |
| 写入 | write |
| 访问字节 | buf[i] |
| 切片 | slice, subarray |
| 拼接 | concat |
| 复制 | copy |
| 判断 | isBuffer |
| 比较 | equals, compare |
| 二进制 | writeUInt*, readUInt* |

浙公网安备 33010602011771号