【第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文件 …...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...