Node.js Buffer 模块详解

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值