← [ BACK_TO_NOTES ]

Buffer(二进制缓冲区)

Buffer 是一段按字节解释的有限内存区域;本页维护二进制缓冲区的通用心智模型,Node.js 的具体 Buffer API 由专门笔记承接。

#concept #growing #dev

[!info] related notes

Buffer(二进制缓冲区)

Buffer 的核心不是某个框架 API,而是“用一段有限字节区域承载尚未被解释成更高层对象的数据”。网络、文件、压缩、加密和媒体处理都会遇到它。

一句话定义

Buffer 是一段按字节读写的有限内存区域;编码、端序和数据结构决定这些字节最终代表什么。

边界:概念模型 vs Node.js API

本页是通用概念层,回答“二进制缓冲区是什么、为什么存在、怎样与字符串和流区分”。Node.js Buffer 是这个概念在 Node.js 中的一套具体类型与 API,负责 Buffer.from()、alloc()、编码转换和数值读写等运行时细节。

因此:

  • “一批字节为什么需要暂存、何时应该流式处理”属于本页;
  • “Buffer.allocUnsafe() 是否会清零”属于 Node.js Buffer;
  • 浏览器里的 ArrayBuffer / TypedArray 与 Node.js Buffer 都可以承载二进制数据,但不是同一个 API;
  • Buffer 描述有限的一块数据,Stream 描述随时间到达的数据序列,两者经常配合而不是互相替代。

为什么需要 Buffer

系统程序经常需要处理:

  • 文件读写
  • 网络数据包
  • 图片、音视频
  • 压缩解压
  • 加密数据

这些都需要直接操作字节。

一个具体实现:Node.js Buffer

下面只用 Node.js 展示“字节区域如何被创建、编码和拼接”;完整 API 统一维护在 Node.js Buffer。

创建

// 从字符串
const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('你好', 'utf8');

// 从数组
const buf3 = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);

// 指定大小(零填充)
const buf4 = Buffer.alloc(1024);

读写

const buf = Buffer.from('hello');

// 转字符串
buf.toString();        // 'hello'
buf.toString('utf8');  // 'hello'
buf.toString('hex');   // '68656c6c6f'

// 读取单个字节
buf[0]; // 104 ('h')

// 写入单个字节
buf[0] = 72;

拼接

const a = Buffer.from('hello');
const b = Buffer.from(' world');
const c = Buffer.concat([a, b]);
c.toString(); // 'hello world'

与 String 的区别

关注点StringBuffer
语义已解释的文本字符尚待解释的字节序列
编码字符串已经具有文本语义字节转文本时必须选择编码
操作单位字符 / code unitbyte
典型用途文本处理文件、网络、加密、媒体

不要把“Buffer = 堆外内存”当作定义。不同语言和运行时可以用不同方式分配底层存储;Buffer 的稳定语义是受边界约束的一段字节数据。

最容易误解的点

  • Buffer 是概念,Node.js Buffer 是具体实现;不要把两者完全等同。
  • “有一块 Buffer”不代表已经知道其内容语义;编码、端序和协议结构仍需另行解释。
  • Buffer 与 Stream 的差异不是“小数据/大数据”这么简单,而是有限块与随时间到达的序列。
  • 在 Node.js 中,Buffer.allocUnsafe()、切片共享内存等实现细节统一看 Node.js Buffer。

学习检查

  1. 为什么一段 UTF-8 字节在解码前更适合被看作 Buffer,而不是 String?
  2. Buffer 与 Stream 各自抽象的是什么,为什么网络读取经常同时用到两者?
  3. “Buffer 一定是堆外内存”为什么不是稳定定义?
  4. 给一段文件数据,哪些信息必须明确后才能把字节可靠解释成文本或数值?

放回主题图里看

创建于 2026/3/19 更新于 2026/10/1
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本