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/8/13 1:35:57 阅读更多 →
3分钟实现GitHub界面中文化:免费开源插件的完整指南

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

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

2026/8/13 1:35:57 阅读更多 →
掌握材料变形分析:Ncorr数字图像相关技术完全指南

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

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

2026/8/13 1:35:57 阅读更多 →

最新新闻

7大Agent岗招聘详情,看懂你就赢了!

7大Agent岗招聘详情,看懂你就赢了!

2026年,如果只选一条高薪赛道,那一定是Agent!今年找工作的同学应该都已经发现,只要打开招聘软件,满屏都是Agent。 “Agent岗是未来5年唯一真神!” “现在已经是Agent的天下了!” “27届不懂A…

2026/8/13 7:19:17 阅读更多 →
Android开发:资源管理与布局优化实战指南

Android开发:资源管理与布局优化实战指南

1. Android资源管理机制解析 在Android开发中,资源管理是构建应用界面的基础环节。每个Android项目都包含一个res目录,这里存放着应用所需的各种静态资源。理解这套机制对于高效开发至关重要。 1.1 资源目录结构详解 标准的res目录包含以下子目录&…

2026/8/13 7:19:17 阅读更多 →
Java JSON序列化库迁移实战:从Fastjson到Jackson的完整指南

Java JSON序列化库迁移实战:从Fastjson到Jackson的完整指南

1. 从Fastjson到Jackson:一次迟到的技术栈迁移在Java后端开发这个行当里,JSON序列化库的选择,几乎和“中午吃什么”一样,是个永恒的话题。我自己的项目,从五六年前开始,就一直在用Fastjson。那时候&#xf…

2026/8/13 7:19:17 阅读更多 →
RAG成本优化实战:基于S3与无服务器架构构建百元级向量检索系统

RAG成本优化实战:基于S3与无服务器架构构建百元级向量检索系统

1. 从“天价账单”到“成本革命”:一个RAG开发者的真实困境上个月,当我收到云服务商的账单时,手抖了一下。一个用于内部知识库问答的RAG应用,仅仅是向量存储这一项,月费就冲到了800多美元。这个数字像一盆冷水&#xf…

2026/8/13 7:19:17 阅读更多 →
Ubuntu 22.04安装QQ音乐:Box86/Wine方案详解与问题排查

Ubuntu 22.04安装QQ音乐:Box86/Wine方案详解与问题排查

1. 项目概述:在Ubuntu 22.04上搞定QQ音乐作为一个在Linux桌面环境里摸爬滚打了十来年的老用户,我太清楚在Ubuntu这类发行版上使用国内主流娱乐软件有多“折腾”了。QQ音乐,这个在国内拥有海量版权曲库和庞大用户群体的播放器,官方…

2026/8/13 7:19:17 阅读更多 →
Node.js入门教程(十八):Stream(流)

Node.js入门教程(十八):Stream(流)

一、什么是 Stream?Node.js 的 Stream 是一种处理流式数据的抽象接口,广泛应用于文件操作、网络通信等场景。流式数据处理的一个主要优点是可以在数据传输过程中就开始处理数据,而不需要等待整个数据加载完毕,这使得 Node.js 能够…

2026/8/13 7:18:17 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →