Node.js入门教程(十七):Buffer(缓冲区)
一、什么是 BufferJavaScript 语言自身只有字符串数据类型没有二进制数据类型。Node.js 中的Buffer 类是用于处理二进制数据的核心工具提供了对二进制数据的高效操作。Buffer 类在处理文件操作、网络通信、图像处理等场景中特别有用。Buffer 的特性特性说明二进制数据Buffer 对象是一个包含原始二进制数据的固定大小的数组每个元素占用一个字节8位适合处理文件内容、网络数据包等固定长度Buffer 对象的内容可以在创建后修改但其长度是固定的不能动态改变二、Buffer 与字符编码Buffer 实例一般用于表示编码字符的序列比如 UTF-8、UCS2、Base64 或十六进制编码的数据。通过使用显式的字符编码就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。const buf Buffer.from(runoob, ascii); // 输出 72756e6f6f62 console.log(buf.toString(hex)); // 输出 cnVub29i console.log(buf.toString(base64));Node.js 支持的字符编码编码说明ascii仅支持 7 位 ASCII 数据速度很快utf8多字节编码的 Unicode 字符许多网页和文档格式都使用 UTF-8utf16le2 或 4 个字节小字节序编码的 Unicode 字符ucs2utf16le 的别名base64Base64 编码latin1一种把 Buffer 编码成一字节编码的字符串方式binarylatin1 的别名hex将每个字节编码为两个十六进制字符三、创建 BufferBuffer 提供了以下 API 来创建 Buffer 类方法说明Buffer.alloc(size[, fill[, encoding]])创建长度为 size 字节的 Buffer每个字节的值为 0推荐Buffer.allocUnsafe(size)创建长度为 size 字节的 Buffer但可能包含旧数据更快但不安全Buffer.allocUnsafeSlow(size)分配给定大小的新 Buffer 实例但不对其进行初始化Buffer.from(array)返回一个被 array 的值初始化的新的 Buffer 实例Buffer.from(arrayBuffer[, byteOffset[, length]])返回与给定 ArrayBuffer 共享同一内存的 BufferBuffer.from(buffer)复制传入的 Buffer 实例的数据返回新的 Buffer 实例Buffer.from(string[, encoding])通过字符串创建 Buffer可指定编码默认为 UTF-8创建示例// 创建一个长度为 10、且用 0 填充的 Buffer const buf1 Buffer.alloc(10); // 创建一个长度为 10、且用 0x1 填充的 Buffer const buf2 Buffer.alloc(10, 1); // 创建一个长度为 10、且未初始化的 Buffer // 这个方法比 Buffer.alloc() 更快但可能包含旧数据 const buf3 Buffer.allocUnsafe(10); // 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer const buf4 Buffer.from([1, 2, 3]); // 创建一个包含 UTF-8 字节的 Buffer const buf5 Buffer.from(tést); // 创建一个包含 Latin-1 字节的 Buffer const buf6 Buffer.from(tést, latin1);四、写入缓冲区语法buf.write(string[, offset[, length]][, encoding])参数参数说明string写入缓冲区的字符串offset缓冲区开始写入的索引值默认为 0length写入的字节数默认为buffer.lengthencoding使用的编码默认为 utf8返回值返回实际写入的大小。如果 buffer 空间不足则只会写入部分字符串。示例buf Buffer.alloc(256); len buf.write(www.runoob.com); console.log(写入字节数 : len);执行以上代码输出结果为$ node main.js 写入字节数 : 14五、从缓冲区读取数据语法buf.toString([encoding[, start[, end]]])参数参数说明encoding使用的编码默认为 utf8start指定开始读取的索引位置默认为 0end结束位置默认为缓冲区的末尾返回值解码缓冲区数据并使用指定的编码返回字符串。示例buf Buffer.alloc(26); for (var i 0 ; i 26 ; i) { buf[i] i 97; } console.log(buf.toString(ascii)); // 输出: abcdefghijklmnopqrstuvwxyz console.log(buf.toString(ascii, 0, 5)); // 输出: abcde console.log(buf.toString(utf8, 0, 5)); // 输出: abcde console.log(buf.toString(undefined, 0, 5)); // 输出: abcde六、将 Buffer 转换为 JSON 对象语法buf.toJSON()当字符串化一个 Buffer 实例时JSON.stringify()会隐式地调用该toJSON()方法。示例const buf Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); const json JSON.stringify(buf); // 输出: {type:Buffer,data:[1,2,3,4,5]} console.log(json); const copy JSON.parse(json, (key, value) { return value value.type Buffer ? Buffer.from(value.data) : value; }); // 输出: Buffer 01 02 03 04 05 console.log(copy);七、缓冲区合并语法Buffer.concat(list[, totalLength])参数参数说明list用于合并的 Buffer 对象数组列表totalLength指定合并后 Buffer 对象的总长度返回值返回一个多个成员合并的新 Buffer 对象。示例var buffer1 Buffer.from(教程); var buffer2 Buffer.from(www.runoob.com); var buffer3 Buffer.concat([buffer1, buffer2]); console.log(buffer3 内容: buffer3.toString());执行以上代码输出结果为buffer3 内容: 教程www.chenbyte.cn八、缓冲区比较语法buf.compare(otherBuffer);参数参数说明otherBuffer与 buf 对象比较的另外一个 Buffer 对象返回值返回一个数字表示buf在otherBuffer之前、之后或相同。示例var buffer1 Buffer.from(ABC); var buffer2 Buffer.from(ABCD); var result buffer1.compare(buffer2); if (result 0) { console.log(buffer1 在 buffer2 之前); } else if (result 0) { console.log(buffer1 与 buffer2 相同); } else { console.log(buffer1 在 buffer2 之后); }执行以上代码输出结果为ABC在ABCD之前九、拷贝缓冲区语法buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])参数参数说明targetBuffer要拷贝的 Buffer 对象targetStart可选默认: 0sourceStart可选默认: 0sourceEnd可选默认:buffer.length返回值没有返回值。示例var buf1 Buffer.from(abcdefghijkl); var buf2 Buffer.from(RUNOOB); // 将 buf2 插入到 buf1 指定位置上 buf2.copy(buf1, 2); console.log(buf1.toString());执行以上代码输出结果为abRUNOOBijkl十、缓冲区裁剪语法buf.slice([start[, end]])参数参数说明start可选默认: 0end可选默认:buffer.length返回值返回一个新的缓冲区它和旧缓冲区指向同一块内存但是从索引start到end的位置剪切。示例var buffer1 Buffer.from(runoob); // 剪切缓冲区 var buffer2 buffer1.slice(0, 2); console.log(buffer2 content: buffer2.toString());执行以上代码输出结果为buffer2 content: ru十一、缓冲区长度语法buf.length;返回值返回 Buffer 对象所占据的内存长度。示例var buffer Buffer.from(www.runoob.com); // 缓冲区长度 console.log(buffer length: buffer.length);执行以上代码输出结果为buffer length: 14十二、Buffer 常用方法参考序号方法 描述1Buffer.from()- 从字符串、数组或 Buffer 创建 Buffer推荐2buf.length- 返回 buffer 的字节数3buf.write(string[, offset[, length]][, encoding])- 写入数据到 buffer4buf.toString([encoding[, start[, end]]])- 从 buffer 读取数据5buf.toJSON()- 将 Buffer 实例转换为 JSON 对象6buf.equals(otherBuffer)- 比较两个缓冲区是否相等7buf.compare(otherBuffer)- 比较两个 Buffer 对象8buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])- 拷贝缓冲区9buf.slice([start[, end]])- 裁剪缓冲区共享内存10Buffer.concat(list[, totalLength])- 合并缓冲区11buf.fill(value[, offset][, end])- 用指定值填充缓冲区12buf.readUInt8(offset[, noAssert])- 读取无符号 8 位整数13buf.readUInt16LE(offset[, noAssert])- 读取无符号 16 位整数小端14buf.readUInt16BE(offset[, noAssert])- 读取无符号 16 位整数大端15buf.readUInt32LE(offset[, noAssert])- 读取无符号 32 位整数小端16buf.readUInt32BE(offset[, noAssert])- 读取无符号 32 位整数大端17buf.readInt8(offset[, noAssert])- 读取有符号 8 位整数18buf.readInt16LE(offset[, noAssert])- 读取有符号 16 位整数小端19buf.readInt16BE(offset[, noAssert])- 读取有符号 16 位整数大端20buf.readInt32LE(offset[, noAssert])- 读取有符号 32 位整数小端21buf.readInt32BE(offset[, noAssert])- 读取有符号 32 位整数大端22buf.readFloatLE(offset[, noAssert])- 读取 32 位浮点数小端23buf.readFloatBE(offset[, noAssert])- 读取 32 位浮点数大端24buf.readDoubleLE(offset[, noAssert])- 读取 64 位双精度数小端25buf.readDoubleBE(offset[, noAssert])- 读取 64 位双精度数大端26buf.writeUInt8(value, offset[, noAssert])- 写入无符号 8 位整数27buf.writeUInt16LE(value, offset[, noAssert])- 写入无符号 16 位整数小端28buf.writeUInt16BE(value, offset[, noAssert])- 写入无符号 16 位整数大端29buf.writeUInt32LE(value, offset[, noAssert])- 写入无符号 32 位整数小端30buf.writeUInt32BE(value, offset[, noAssert])- 写入无符号 32 位整数大端31buf.writeInt8(value, offset[, noAssert])- 写入有符号 8 位整数32buf.writeInt16LE(value, offset[, noAssert])- 写入有符号 16 位整数小端33buf.writeInt16BE(value, offset[, noAssert])- 写入有符号 16 位整数大端34buf.writeInt32LE(value, offset[, noAssert])- 写入有符号 32 位整数小端35buf.writeInt32BE(value, offset[, noAssert])- 写入有符号 32 位整数大端36buf.writeFloatLE(value, offset[, noAssert])- 写入 32 位浮点数小端37buf.writeFloatBE(value, offset[, noAssert])- 写入 32 位浮点数大端38buf.writeDoubleLE(value, offset[, noAssert])- 写入 64 位双精度数小端39buf.writeDoubleBE(value, offset[, noAssert])- 写入 64 位双精度数大端十三、本章小结知识点说明Buffer 是什么Node.js 中处理二进制数据的核心工具创建 Buffer推荐使用Buffer.from()、Buffer.alloc()写入数据buf.write()将字符串写入缓冲区读取数据buf.toString()从缓冲区读取字符串合并与复制Buffer.concat()合并buf.copy()复制裁剪buf.slice()裁剪共享内存注意修改影响原 Buffer长度buf.length获取缓冲区字节数JSON 转换buf.toJSON()转换为 JSON 对象编码支持UTF-8、ASCII、Base64、Hex 等多种编码提示Buffer.allocUnsafe()虽然更快但可能包含旧数据使用前需要填充或覆盖。推荐在大多数场景下使用Buffer.alloc()或Buffer.from()以确保安全。

相关新闻

Java AI客户端源码拆解:从HTTP请求到流式响应的工程实践

Java AI客户端源码拆解:从HTTP请求到流式响应的工程实践

1. 项目概述:为什么我们要拆解一个AI对话客户端?最近在团队里做技术分享,聊到AI应用开发,发现一个挺有意思的现象:很多同事对调用ChatGPT、文心一言这类大模型的API接口很熟,但当你问他“从你点击发送按钮到…

2026/10/18 13:43:49 阅读更多 →
3分钟实现GitHub界面中文化:免费开源插件的完整指南

3分钟实现GitHub界面中文化:免费开源插件的完整指南

3分钟实现GitHub界面中文化:免费开源插件的完整指南 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾经因为GitHub…

2026/10/19 17:22:43 阅读更多 →
掌握材料变形分析:Ncorr数字图像相关技术完全指南

掌握材料变形分析:Ncorr数字图像相关技术完全指南

掌握材料变形分析:Ncorr数字图像相关技术完全指南 【免费下载链接】ncorr_2D_matlab 2D Digital Image Correlation Matlab Software 项目地址: https://gitcode.com/gh_mirrors/nc/ncorr_2D_matlab 还在为精确测量材料表面的微小变形而烦恼吗?想…

2026/10/17 10:12:07 阅读更多 →

最新新闻

DeskcommCRM实战:轻量级客户管理与销售跟进全流程落地指南

DeskcommCRM实战:轻量级客户管理与销售跟进全流程落地指南

1. 项目概述:DeskcommCRM 到底是什么,以及为什么值得关注这两年市面上叫 CRM 的产品多得数不过来,但绝大多数都陷入了一个怪圈:功能越做越重,权限越加越细,你要是只为了管好手头几百个客户,得先…

2026/10/19 23:47:06 阅读更多 →
以沟通为核心的轻量级CRM系统设计与实践

以沟通为核心的轻量级CRM系统设计与实践

一个叫 DeskcommCRM 的项目,听起来有点像某个内部系统的代号,但实际上它代表了一类特别值得聊的东西:以“沟通”为核心的客户关系管理工具。我一开始接触这个项目名的时候,第一反应是“Deskcomm”可能是 Desk Communication 的缩写…

2026/10/19 23:47:06 阅读更多 →
从线程池失控到全局限流:高并发系统稳定性实战指南

从线程池失控到全局限流:高并发系统稳定性实战指南

1. 并发失控的第一现场:线程池是怎么被击穿的先说一个我实际排查过的案例场景。某公司核心交易链路的订单服务,平时性能表现很稳定,高峰期单机支撑上千QPS没有任何压力。但一次大促活动中,下游的库存服务因为数据库连接池被打满&a…

2026/10/19 23:39:50 阅读更多 →
STC单片机范例程序实战指南:从点灯到多外设工程搭建

STC单片机范例程序实战指南:从点灯到多外设工程搭建

简介:这是一份面向嵌入式初学者与单片机开发者的STC单片机C语言范例程序合集,围绕ADC采样、串口通信、EEPROM读写、ISP在系统编程、时钟中断、端口测试及优化编程思想等核心功能展开,适合用于课程实验、自学练手与项目参考。资源包共612个文件…

2026/10/19 23:39:50 阅读更多 →
Kafka全链路性能调优:吞吐量与延迟的实战权衡

Kafka全链路性能调优:吞吐量与延迟的实战权衡

前阵子业务告警群里又炸了——消费延迟从平时的几百毫秒一路飙到分钟级,P99 延迟曲线在监控面板上直接拉成一条陡坡。接手这套 Kafka 系统两年,类似的戏码每隔一阵就重演一次。与其每次都临时救火,不如把全链路参数优化这件事系统捋一遍。这篇…

2026/10/19 23:37:47 阅读更多 →
ZXing.Net 0.16.8.0 条码识别实战:从解码链路到性能调优

ZXing.Net 0.16.8.0 条码识别实战:从解码链路到性能调优

简介:ZXing.Net.0.16.8.0 是面向 C# 与 Unity 开发者的开源条码处理库,基于 Zebra Crossing 项目,可在 .NET 框架与 Unity 引擎中实现 QR 码、Aztec、Code 128、EAN 等多种条码的读取与生成。开发者只需调用少量 API 即可为桌面应用、移动端或…

2026/10/19 23:37:47 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →