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 的常用场景

  1. 文件 IO

const fs = require('fs');
const buf = fs.readFileSync('a.png'); // 返回 Buffer
  1. 网络数据包(TCP)

socket.on('data', (buf) => {
  console.log(buf); // Buffer
});
  1. 编码转换(utf8/hex/base64)

let b64 = Buffer.from('hello').toString('base64');
  1. 二进制协议解析

buf.readUInt32BE(0);
  1. 操作图片、音频、加密数据等


🟦 三、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*
posted @ 2025-12-10 17:07  jerry-mengjie  阅读(9)  评论(0)    收藏  举报