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

第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)
专栏目录 第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)-CSDN博客 第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题…...

C# .NET6 Log4net输出日志
C# Log4Net用法-CSDN博客: .NET6.0的日志组件Log4net_.net log4net-CSDN博客 在 C# .NET6 开发中,log4net 是一个常用的日志记录框架,它可以帮助我们方便地输出日志信息。本教程将向你展示如何在 C# .NET6 中实现 log4net 的日志输出功能。 整体流程 下…...

python数据结构与算法-03_链表
链式结构 上一节讲到了支持随机访问的线性结构,这次我们开始讲链式结构, 视频里我会说下这两种结构的区别,然后讲解最常见的单链表和双链表。 之前在专栏文章那些年,我们一起跪过的算法题[视频]里实现过一个 lru_cache, 使用到的…...

Springboot-aop的使用
aop:面向切面编程,可以看作是面向对象的补充 举例 1.依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.1</version><relativePath/>…...
数列计算
题目描述 有一列数是 : 请找出这个数列的规律,编写程序计算并输出这个数列的第项,要求是分数形式,并计算这个数列的前项和 ( 结果四舍五入保留两位小数 ) 输入格式 第一行仅有一个正整数 () 。 输出格式 共有 行,第一…...

阿里云全球故障凸显“云集中”风险
阿里云12日发生的全球性故障再次将“云集中风险”推上风口浪尖。这一公有云史上罕见的事件不仅影响了数以万计的企业和服务,也引发了对云服务集中化趋势的深刻反思。 2023年11月12日17:44(GMT8)开始,阿里云基础设施发生严重故障,导致阿里巴巴…...

【2015年数据结构真题】
用单链表保存m个整数,结点的结构为 [data] [link],且|data|<n(n为正整数)。现要求设计一个时问复杂度尽可能高效的算法,对于链表中 data 的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。例如ÿ…...

vxe表格行拖拽
安装第三方插件 import Sortable from sortablejs 可以跟后端商议表格添加seq 顺序, 按照循序排序 secondInput 调用 修改接口api 然后重新获取数据 //在get 请求之后 使用nextTick 使用 const rowDrop () > {nextTick(() > {let xTable2 planDat…...

Linux之基本指令操作
1、whoami whoami:查看当前账号是谁 2、who who:查看当前我的系统当中有哪些用户,当前有哪些人登录了我的机器 3、 pwd pwd:查看我当前所处的目录,就好比Windows下的路径 4、ls ls:查看当前目录下的文件信…...

海康设备、LiveNVR等通过GB35114国密协议对接到LiveGBS GB28181/GB35114平台的详细操作说明
一、LiveNVR通过GB35114接入LiveGBS 1.1 开启LiveGBS 35114功能 信令服务livecms.ini配置文件中[sip]增加一行gm1 启动LiveCMS 1.2 生成设备端证书 我们用LiveNVR做为设备端向LiveGBS注册,这里先生成LiveNVR的设备证书,并将LiveNVR的设备证书给LiveGB…...