【第2章 Node.js基础】2.6 Node.js 的Buffer数据类型
Buffer数据类型
文章目录
- Buffer数据类型
- 什么是Buffer数据类型
- Buffer 的特点
- 创建Buffer实例
- Buffer用于编码转换
- 将Buffer 实例转换为JSON 对象
- Buffer实例基本操作
- 1. 写入Buffer实例:
- 2. 从Buffer实例读取数据:
- 3. Buffer实例合并:
- 4. Buffer实例复制:
- 5. Buffer实例切片:
什么是Buffer数据类型
Buffer 是 Node.js 中用于处理二进制数据的数据类型,可以将其视为一种缓冲区或缓冲器。它类似于整数数组,但是在创建时分配了固定大小的原始内存,并且大小无法更改。
Buffer 的特点
Buffer 的特点包括:
- 固定大小:Buffer 实例在创建时需要指定大小,且无法更改。这使得 Buffer 在处理二进制数据时更加高效。
- 原始内存分配:Buffer 实例在内存中分配了原始的二进制数据存储空间,可以直接对其进行读取和写入操作。
- 全局作用域:Buffer 类位于全局作用域中,因此无需使用 require() 加载即可直接使用。
通过使用 Buffer,Node.js 可以处理 TCP 流、文件系统操作以及其他需要与二进制字节流进行交互的场景。Buffer 提供了一系列方法和属性,用于读取、写入和操作二进制数据,使得在 Node.js 中处理二进制数据变得更加方便和高效。
总结起来,Buffer 是 Node.js 中用于处理二进制数据的数据类型,具有固定大小、原始内存分配和全局作用域的特点。它是处理 TCP 流、文件系统操作等二进制数据交互的重要工具。
创建Buffer实例
在 Node.js 6.0.0 之前的版本中,Buffer 实例是使用Buffer 构造函数创建的。之后的版本中,Buffer 实例创建改为
- Buffer.from()
- Buffer.alloc()
- Buffer.allocUnsafe()
// 创建一个包含数组[0x1, 0x2, 0x3]的Buffer实例
const buf1 = Buffer.from([1, 2, 3]);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer实例
const buf2 = Buffer.from('tést');
// 创建一个包含 Latin-1(说明见2.6.2节)字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer实例
const buf3 = Buffer.from('tést', 'latin1');
// 创建一个长度为 10、且用零填充的 Buffer实例
const buf4 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer实例
const buf5 = Buffer.alloc(10, 1);
/* 创建一个长度为 10、且未初始化的 Buffer实例。这个方法比调用 Buffer.alloc()更快,
但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。*/
const buf6 = Buffer.allocUnsafe(10);
Buffer用于编码转换
这里先介绍一下字符集(Charset)和字符编码(Encoding)这两个概念。文字内容在计算机中的存储格式实际是二进制的字节流,这两者之间的转换需要一个统一的标准,就是各种字符集标准,其规定了每个字符与二进制数字存储方式(编码》的转换关系。字符集只是一个规则集合的名称,而字符集要正确编码转码一个字符还需要字库表、编码字符集和字符编码的支持。
字库表决定整个字符集能够表示的字符的范围。编码字符集则用一个编码值来表示一个字符在字库中的位置。字符编码确定编码字符集和实际存储数值之间的转换关系。例如,Unicode 是编码字符集,而UTF-8、UTF-16 就是字符编码,即符合 Unicode 规则的字库的一种实现形式。
Buffer 实例一般用于表示编码字符的序列,如UTF-8、UCS2、Base64 或十六进制编码的数据在文件操作和网络操作中,如果没有显式声明编码格式,返回数据的默认类型为 Buffer。例如,读取文件时不指定编码格式,得到的结果就是 Buffer 字符串。通过使用显式的字符编码,就可以将 Buffer 实例与普通的JavaScript 字符串进行相互转换。
Node.is 目前支持的字符编码如下。
- ascii: 仅适用于7位ASCI 数据。此编码速度很快,如果设置这种编码,将从数据中删除高位。
- utf8:多字节编码的 Unicode 字符。许多网页和文档都使用这种编码格式。
- utf16le: 2 个或4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至U+10FFFF)。ucs2 是它的别名
- base64: Base6 编码。
- latin1:一种将 Buffer编码成单字节编码字符串的方法。binary 是latin1的别名
- hex: 将每个字节编码成两个十六进制的字符。
在创建Buffer实例时指定存入字符串的字符编码const buf = Buffer.from('hello world', 'ascii');
将已创建的Buffer实例转换成字符串的语法 : buf.toString([encoding[, start[, end]]])
toString方法根据参数encoding指定的字符编码将 buf对象解码成字符串。其中参数encoding 指定所用的字符编码,默认值为ut8:stat 指定开始解码的字节偏移量,默认值为0;end 指定结束解码的字节偏移量,默认值为 buf.ength。返回的结果是字符串。下面是一个简单的例子:
const buf = Buffer.from('tést');
console.log(buf.toString('hex'));// 输出结果: 74c3a97374
console.log(buf.toString('utf8', 0, 3));//输出结果:té
将Buffer 实例转换为JSON 对象
可以使用buftoJSON0方法将 Buffer 实例转换为JSON 对象,这种用法适用于将二进制数据转换为JSON 格式。当一个Buffer 实例字符串化时,JSON.stringifv0会隐式地调用tOJSON0方法,该方法返回一个JSON对象。下面的例子示范如何将 Buffer 实例转换为JSON对象。
【示例:Buffer 对象转JSON 对象(buf to_ison.js)】
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
console.log(json); // 输出:{"type":"Buffer","data":[1,2,3,4,5]}
const copy = JSON.parse(json, (key, value) => {return value && value.type === 'Buffer' ?Buffer.from(value.data) :value;
});
console.log(copy); // 输出: <Buffer 01 02 03 04 05>
Buffer实例基本操作
Buffer是Node.js中用于处理二进制数据的类。以下是Buffer的常用操作:
- 写入 Buffer 实例
- 从 Buffer 实例读取数据
- Buffer 实例合并
- Buffer 实例复制
- Buffer 实例切片
1. 写入Buffer实例:
可以使用Buffer.from()或Buffer.alloc()方法创建一个Buffer实例,并使用write()方法向Buffer中写入数据。
const buf = Buffer.alloc(5); // 创建一个长度为5的Buffer实例
buf.write('hello'); // 向Buffer实例写入数据
2. 从Buffer实例读取数据:
可以使用toString()方法将Buffer实例中的数据转换为字符串。
const buf = Buffer.from('hello'); // 创建一个包含字符串的Buffer实例
const str = buf.toString(); // 将Buffer实例中的数据转换为字符串
console.log(str); // 输出: hello
3. Buffer实例合并:
可以使用Buffer.concat()方法将多个Buffer实例合并成一个。
const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('world');
const mergedBuf = Buffer.concat([buf1, buf2]); // 合并两个Buffer实例
console.log(mergedBuf.toString()); // 输出: helloworld
4. Buffer实例复制:
可以使用copy()方法将一个Buffer实例的数据复制到另一个Buffer实例中。
const buf1 = Buffer.from('hello');
const buf2 = Buffer.alloc(5);
buf1.copy(buf2); // 将buf1的数据复制到buf2中
console.log(buf2.toString()); // 输出: hello
5. Buffer实例切片:
可以使用slice()方法从一个Buffer实例中创建一个新的Buffer实例,包含原始Buffer实例的指定部分数据。
const buf = Buffer.from('hello world');
const slicedBuf = buf.slice(6, 11); // 从第6个字节到第11个字节创建一个新的Buffer实例
console.log(slicedBuf.toString()); // 输出: world
这些是Buffer的一些常用操作,可以帮助你处理二进制数据。在实际开发中,还有更多的Buffer操作可以探索和应用。
相关文章:
【第2章 Node.js基础】2.6 Node.js 的Buffer数据类型
Buffer数据类型 文章目录 Buffer数据类型什么是Buffer数据类型Buffer 的特点 创建Buffer实例Buffer用于编码转换将Buffer 实例转换为JSON 对象Buffer实例基本操作1. 写入Buffer实例:2. 从Buffer实例读取数据:3. Buffer实例合并: 4. Buffer实例…...
reactive和effect,依赖收集触发依赖
通过上一篇文章已经初始化项目,集成了ts和jest。本篇实现Vue3中响应式模块里的reactive方法。 前置知识要求 如果你熟练掌握Map, Set, Proxy, Reflect,可直接跳过这部分。 Map Map是一种用于存储键值对的集合,并且能够记住键的原始插入顺…...
【C#学习】backgroundWorker控件
BackgroundWorker 控件的几个实例(C# backgroundworker使用方法): 在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。 解决的方法就是新开一个线程ÿ…...
Istio学习笔记-部署模型
参考:Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时,需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中? 是将所有服务都放置在单个完全连接的网络中,还是需要网关来跨多个网络连接服务&#…...
磁盘调度算法
磁盘调度算法是计算机操作系统中用于管理磁盘上的数据访问的重要组成部分。这些算法有助于优化数据的读写操作,以减少磁盘访问时间,提高系统性能。以下是一些常见的磁盘调度算法: 先来先服务(FCFS,First-Come-First-Se…...
力扣题库2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开…...
【Linux】第十六站:进程地址空间
文章目录 一、程序地址空间1.内存的分布2.static修饰后为什么不会被释放3.一个奇怪的现象 二、进程地址空间1.前面现象的原因2.地址空间究竟是什么?3.为什么要有进程地址空间4.页表5.什么叫进程?6.进程具有独立性。为什么?怎么做到呢…...
基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍…...
如何在面试中胜出?接口自动化面试题安排上
📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…...
联邦学习研究综述笔记
联邦学习 联邦学习的定义:联邦学习是一种分布式机器学习架构,包含多个客户端(参与者)和一个聚合服务器。客服端(参与方):在本地使用自己的私有数据训练模型,训练完成之后将模型的参…...
RedisTemplate乱码问题
其实这是在解决一个项目问题是发现的,因为原开发者的大意,造成了系统出现严重的逻辑问题。 因为系统系统采用分模块开发,某模块使用Spring提供的RedisTemplate进行值的读写,另一位使用了框架基于Jedis的一套公用方法进行值的读写…...
Java用户和内核交互图
...
2023.11.14使用bootstrap制作一个简洁的前端注册登录页
2023.11.14使用bootstrap制作一个简洁的前端注册登录页 比较简洁的登录页,主要是为自己开发的一些平台页面做测试用,前端具备功能如下: (1)输入用户名、密码,需补充后端验证代码。 (2ÿ…...
Avatar虚拟形象解决方案,趣味化的视频拍摄与直播新体验
企业们正在寻找新的方式来吸引和保持观众的注意力,一种新兴的解决方案就是使用Avatar虚拟形象技术,这种技术可以让用户在视频拍摄或直播场景中,以自定义的数字人形象出现,同时保持所有的表情和脸部驱动。美摄科技正是这个领域的领军者&#x…...
MongoDB备份与恢复以及导入导出
MongoDB备份与恢复 1、mongodump数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据 (数据和数据结构) 或指定数据(集合、部分集合内容)到指定目录中。 语法: mongodump -h dbhost -d dbname -o dbdirec…...
如何挑选猫主食罐头?宠物店自用的5款猫主食罐头推荐!
临近双十二大促,是时候给家里的猫主子屯猫主食罐头了。许多铲屎官看大促的各种品牌宣传,看到眼花缭乱,不知道选哪些猫主食罐头好,胡乱选又怕踩坑。 猫罐头侠闪亮登场!如何挑选猫主食罐头?作为经营宠物店7年…...
立哥先进研发-API安全方案
项目背景:随着技术进步,很多优秀技术也被用在黑灰产之中,例如爬虫系统在票务系统中的滥用,尤其机票系统。机票爬虫们威力之大,让人叹为观止:多数订票网站,真实用户产生的不到10%,其浏…...
小函数:Lambda表达式(Java篇)
Lambda表达式的使用场景:用以简化接口实现。 关于接口实现,可以有很多种方式来实现。例如:设计接口的实现类、使用匿名内部类。 但是lambda表达式,比这两种方式都简单! lambda表达式毕竟只是⼀个匿名方法。当实现的接…...
RSS订阅快速连接Notion
数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成,从而高效实现工作流程自动化,降本增效! 1.产品介绍 RSS订阅是数环通的内置应用,很多用户通过RSS订阅来收集自己在各大平台上看的内容,当RSS…...
VMware ubuntu 新虚拟机的创建
根据自己指定的路径安装好vm后。 创建新的虚拟机。 记录一下,下次用到别再忘记了。 如需转载,注明出处! 点赞收藏关注我 以资鼓励 打开vm 软件,点击创建新的虚拟机 选择典型,点击下一步 选择你的ubuntu镜像iso文件 …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
