Buffer

简介: 【10月更文挑战第23天】

在 Node.js 中,Buffer 类是用来处理二进制数据流的,它允许你操作字节级别的数据。由于 JavaScript 语言本身没有原生的二进制数据类型,Buffer 类成为了在 Node.js 中处理二进制数据的重要工具。Buffer 实例类似于整数数组,但它对应的是 V8 堆内存之外的一块原始内存。

Buffer 的使用场景

  • 处理 TCP 流或文件流时的二进制数据。
  • 处理非 UTF-8 编码的文本数据。
  • 处理图像、音频、视频等二进制文件。

创建 Buffer 实例

Node.js 提供了多种方式来创建 Buffer 实例:

// 使用 Buffer.alloc() 创建一个指定大小的 Buffer 实例,并用 0 填充
const buf1 = Buffer.alloc(10);

// 使用 Buffer.alloc() 创建一个指定大小并用特定值填充的 Buffer 实例
const buf2 = Buffer.alloc(10, 1); // 用 0x1 填充

// 使用 Buffer.allocUnsafe() 创建一个未初始化的 Buffer 实例
// 这种方式不推荐,因为它可能包含敏感数据
const buf3 = Buffer.allocUnsafe(10);

// 使用 Buffer.from() 从数组创建 Buffer 实例
const buf4 = Buffer.from([1, 2, 3]);

// 使用 Buffer.from() 从字符串创建 Buffer 实例
const buf5 = Buffer.from('tést');

// 使用 Buffer.from() 从字符串和指定编码创建 Buffer 实例
const buf6 = Buffer.from('tést', 'latin1');

Buffer 与字符编码

Buffer 实例通常用于表示特定编码的字符序列,例如 UTF-8、UCS2、Base64 或十六进制编码的数据。你可以通过指定字符编码在 Buffer 实例与 JavaScript 字符串之间进行转换。

// 创建一个包含字符串 'runoob' 的 Buffer 实例,使用 ascii 编码
const buf = Buffer.from('runoob', 'ascii');

// 将 Buffer 实例转换为十六进制字符串
console.log(buf.toString('hex')); // 输出:72756e6f6f62

// 将 Buffer 实例转换为 base64 编码的字符串
console.log(buf.toString('base64')); // 输出:cnVub29i

Node.js 支持的字符编码

  • ascii - 7 位 ASCII 编码。
  • utf8 - 多字节编码的 Unicode 字符。
  • utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。
  • ucs2 - utf16le 的别名。
  • base64 - Base64 编码。
  • latin1 - 一字节编码的字符串。
  • binary - latin1 的别名。
  • hex - 将每个字节编码为两个十六进制字符。

Buffer 的其他操作

Buffer 类还提供了许多其他操作,例如切片、比较、复制等。以下是一些示例:

// 创建一个 Buffer 实例
const buf = Buffer.from('Hello World', 'utf8');

// 切片操作,获取从索引 6 到 11 的部分
const slice = buf.slice(6, 11);
console.log(slice.toString()); // 输出:World

// 复制操作,将部分数据从一个 Buffer 实例复制到另一个
const copy = Buffer.alloc(10);
buf.copy(copy, 0, 0, 5);
console.log(copy.toString('utf8', 0, 5)); // 输出:Hello
目录
相关文章
|
存储 Java 索引
43 # buffer 的应用
43 # buffer 的应用
62 0
|
6月前
|
存储 算法 关系型数据库
Buffer Pool
Buffer Pool
59 1
|
存储 缓存 算法
Buffer
Buffer
242 0
Buffer
|
存储 SQL 缓存
写缓冲(change buffer),这次彻底懂了!!!
一次了解缓冲池(buffer pool)。
586 0
写缓冲(change buffer),这次彻底懂了!!!