Node.js中Buffer API详解
Node.js中Buffer API详解
在Node.js中,Buffer是一个用于处理二进制数据流的全局对象,它类似于数组,但可以存储任意大小的数据。Buffer对象是由C++代码实现的底层结构,而JavaScript代码则提供了一些高级的API。本文将介绍Node.js中Buffer的各种API,包括创建、读写、转换、比较等。
Buffer的创建
在Node.js中,可以通过多种方式创建Buffer对象,包括使用字符串、数组、数字等作为参数。下面是一些常见的创建Buffer对象的方式:
1. Buffer.alloc(size[, fill[, encoding]])
创建一个指定大小的Buffer对象,并将所有字节初始化为0或指定的fill值。
const buf = Buffer.alloc(5);
console.log(buf); // <Buffer 00 00 00 00 00>
2. Buffer.allocUnsafe(size)
创建一个指定大小的Buffer对象,但不会初始化所有字节,可能包含敏感数据。
const buf = Buffer.allocUnsafe(5);
console.log(buf); // <Buffer 00 00 00 00 00>
3. Buffer.from(array)
创建一个包含指定数组元素的Buffer对象。
const buf = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
console.log(buf); // <Buffer 48 65 6c 6c 6f>
4. Buffer.from(string[, encoding])
创建一个包含指定字符串的Buffer对象。
const buf = Buffer.from('hello', 'utf8');
console.log(buf); // <Buffer 68 65 6c 6c 6f>
Buffer的读写
在Node.js中,可以使用一些API对Buffer进行读写操作,包括读取、写入、拷贝、比较等。下面是一些常见的读写Buffer的API:
1. 读取数据
buf[index]
获取指定位置的字节。
const buf = Buffer.from('hello', 'utf8');
console.log(buf[0]); // 104
buf.toString([encoding[, start[, end]]])
将Buffer对象转换成字符串。
const buf = Buffer.from('hello', 'utf8');
console.log(buf.toString('utf8')); // 'hello'
buf.toJSON()
将Buffer对象转换成JSON对象。
const buf = Buffer.from('hello', 'utf8');
console.log(buf.toJSON()); // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }
2. 写入数据
buf[index] = value
设置指定位置的字节为指定值。
const buf = Buffer.alloc(5);
buf[0] = 104;
console.log(buf); // <Buffer 68 00 00 00 00>
buf.write(string[, offset[, length]][, encoding])
将指定字符串写入Buffer对象中。
const buf = Buffer.alloc(5);
buf.write('hello');
console.log(buf); // <Buffer 68 65 6c 6c 6f>
3. 拷贝数据
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
将一个Buffer对象中的数据拷贝到另一个Buffer对象中。
const buf1 = Buffer.from('hello');
const buf2 = Buffer.alloc(3);
buf1.copy(buf2);
console.log(buf2); // <Buffer 68 65 6c>
4. 比较数据
buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])
比较两个Buffer对象的大小关系,返回值为-1、0或1,分别表示第一个Buffer对象小于、等于或大于第二个Buffer对象。
const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('world');
console.log(buf1.compare(buf2)); // -1
Buffer的转换
在Node.js中,可以使用一些API将Buffer对象转换成其他类型的数据,包括字符串、数组、数字等。下面是一些常见的Buffer转换API:
1. Buffer.concat(list[, totalLength])
将多个Buffer对象拼接成一个Buffer对象。
const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('world');
const buf = Buffer.concat([buf1, buf2]);
console.log(buf); // <Buffer 68 65 6c 6c 6f 77 6f 72 6c 64>
2. buf.toString([encoding[, start[, end]]])
将Buffer对象转换成字符串。
const buf = Buffer.from('hello', 'utf8');
console.log(buf.toString('utf8')); // 'hello'
3. buf.toJSON()
将Buffer对象转换成JSON对象。
const buf = Buffer.from('hello', 'utf8');
console.log(buf.toJSON()); // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }
4. buf.values()
返回一个包含Buffer对象中所有字节值的迭代器。
const buf = Buffer.from('hello', 'utf8');
for (const byte of buf.values()) {console.log(byte);
}
Buffer的其他API
除了上述API外,Node.js中还有一些其他的Buffer API,包括:
1. buf.byteLength
获取Buffer对象的字节长度。
const buf = Buffer.from('hello', 'utf8');
console.log(buf.byteLength); // 5
2. buf.slice([start[, end]])
截取一个Buffer对象的一部分,返回一个新的Buffer对象。
const buf1 = Buffer.from('hello');
const buf2 = buf1.slice(0, 2);
console.log(buf2); // <Buffer 68 65>
3. buf.fill(value[, offset[, end]][, encoding])
将Buffer对象中的所有字节设置为指定值。
const buf = Buffer.alloc(5);
buf.fill(0);
console.log(buf); // <Buffer 00 00 00 00 00>
总结
本文介绍了Node.js中Buffer的各种API,包括创建、读写、转换、比较等。Buffer是Node.js中一个非常重要的对象,它可以方便地处理二进制数据流,在网络通信、文件操作、加密解密等领域都有广泛的应用。如果您是一名Node.js开发者,那么熟悉Buffer的相关知识是必不可少的。
相关文章:
Node.js中Buffer API详解
Node.js中Buffer API详解 在Node.js中,Buffer是一个用于处理二进制数据流的全局对象,它类似于数组,但可以存储任意大小的数据。Buffer对象是由C代码实现的底层结构,而JavaScript代码则提供了一些高级的API。本文将介绍Node.js中B…...

【Hello Algorithm】暴力递归到动态规划(三)
暴力递归到动态规划(三) 最长公共子序列递归版本动态规划 最长回文串子序列方法一方法二递归版本动态规划 象棋问题递归版本动态规划 咖啡机问题递归版本动态规划 最长公共子序列 这是leetcode上的一道原题 题目连接如下 最长公共子序列 题目描述如下…...
gitLab更新11.11.3->16.1.5
gitlab当前版本11.11.3 postgreSQL当前版本 9.6.11 gitlab升级顺序 11.11.3 -》 12.0.12 -》 12.10.14 -》13.0.14 -》 13.1.11 -》13.8.8 -》13.12.15 -》14.0.12 —》 14.3.6 -》 14.9.5 -》 14.10.5 -》 15.0.5 -》 15.1.6 -》 15.4.6 -》 15.11.13 -》 16.0.X —》 16.…...

12-k8s-HPA自动扩缩容
文章目录 一、k8s弹性伸缩类型二、HPA原理三、metrics-server插件四、创建nginx提供负载测试五、部署HPA master操作即可 一、k8s弹性伸缩类型 Cluster-Autoscale: 集群容量(node数量)自动伸缩,跟自动化部署相关的,依赖iaas的弹性伸缩,主要用…...

从十月稻田,看大米为何能卖出200亿市值?
国无农不稳,民无粮不安。新时代的农村农民,需要现代化的农业作依托,而在农业现代化的过程中,品牌化、数字化成为至关重要的一环。 金秋十月,从南到北,从东到西,中国农村的每一块土地都洋溢着丰…...

功能集成,不占空间,同为科技TOWE嵌入式桌面PDU超级插座
随着现代社会人们生活水平的不断提高,消费者对生活质量有着越来越高的期望。生活中,各式各样的电气设备为我们的生活带来了便利,在安装使用这些用电器时,需要考虑电源插排插座的选择。传统的插排插座设计多暴露于空间之中…...
使用pdf.js预览pdf文件时如何兼容chrome66版本
最近在做一个需求,在PC端实现预览pdf文件的功能,但是要最低兼容chrome的66版本,因为公司用的chrome浏览器最低版本就是66版本。 现在下载PDF.js(链接:https://mozilla.github.io/pdf.js/) 下载下来的版本是…...

一篇文章讲明白double、float丢失精度的问题
1.背景 1.10.1 1.2000000000000002 发现上面计算的值竟然和数学计算不一致 2. 问题 计算机是通过二进制计算的,如果我们在二进制的视角来看待上面问题,就很容易发现问题了。 例如:把「0.1」转成二进制的表示,然后还原成十进制&…...

Day 2 Qt
#include "my_widget.h" #include "ui_my_widget.h"My_Widget::My_Widget(QWidget *parent): QWidget(parent), ui(new Ui::My_Widget) {ui->setupUi(this);//窗口的相关设置 // this -> resize(800,500);this -> setWindowTitle("QQ聊天…...

ArmSoM-W3之RK3588 MPP环境配置
1. 简介 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不 同芯片的差异,为使用者…...
【C++ 拷贝构造函数详解】
在 C 编程中,拷贝构造函数是一个重要的概念,用于创建一个对象的副本。拷贝构造函数允许你在不改变原始对象的情况下创建一个新的对象,这在很多情况下非常有用。在本篇博客中,我们将详细讨论 C 拷贝构造函数的用法和实现。 什么是…...

[计算机提升] 用户和用户组
1.1 用户和用户组 1.1.1 用户 用户账户是计算机操作系统中用于标识和管理用户身份的概念。 每个用户都拥有一个唯一的用户账户,该账户包含用户的登录名、密码和其他与用户身份相关的信息。 用户账户通常用于验证用户身份,并授权对系统资源的访问权限。…...

开路、断路和短路区别
文章目录 开路和断路击穿电源短路、用电器短路、对地短路和对电源短路 开路和断路 开路和断路是电路中两种用于描述电流流动情况的状态。 两者易混淆,常被混淆使用,但是它们还是有所不同。 开路表示电路中存在一个断链,电流无法从一个点流到…...

springBoot web开发自动配置和默认效果
web开发自动配置和默认效果 自动配置默认配置 自动配置 绑定了配置文件的一堆配置项 1、springMVC的所有配置 spring.mvc 2、Web场景通用配置 spring.web 3、文件上传配置 spring.servlet.multipart 4、服务器的配置serve: 比如:编码方式等 默认配置 重要…...

论文阅读:Efficient Point Cloud Segmentation with Geometry-Aware Sparse Networks
来源:ECCV2022 链接:Efficient Point Cloud Segmentation with Geometry-Aware Sparse Networks | SpringerLink 0、Abstract 在点云学习中,稀疏性和几何性是两个核心特性。近年来,为了提高点云语义分割的性能,人们提…...

1-k8s1.24-底座搭建-基于containerd
文章目录 一、服务器准备二、安装Containerd三、安装k8s四、安装部署dashboard ps:第一遍搭建ks8的时候,由于k8s在1.24版本之后就放弃了对docker的支持,如果要继续使用docker需要自己加载插件。所以一开始就是直接使用 k8s1.24containerd进行…...
Java文件前后端上传下载工具类
任何非压缩格式下载 package com.pisx.pd.eco.util;import java.io.*; import java.util.Collections; import java.util.HashMap; import java.util.Map;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse;import org.springframewo…...
内燃机可变气门驱动研究进展
Review of Advancement in Variable Valve Actuation of Internal Combustion Engines AbstractIntroduction燃烧和气体交换需要电子控制 paper Abstract 近年来,人们对空气污染和能源使用的日益关注导致了车辆动力总成系统的电气化。 另一方面,一个多世…...
NEFU离散数学实验2-容斥原理
相关概念 离散数学中的容斥原理是一种使用集合运算的技巧,通常用于计算两个或更多集合的并集或交集的大小。以下是一些与容斥原理相关的常见概念和公式。 概念: 1. 集合:由元素组成的对象,通常用大写字母表示,如A、B、…...

解决Windows内存溢出/占满死机问题-PoolMon工具
某一天, 工作所用笔记本突然越来越卡直至死机 以为只是windows11的抽风行为,之前就因为windows11资源管理器经常卡死(后升级小版本好多了)。 遂长按电源键强制关机重启。 然慢慢又越来越卡,直至卡死,无…...

【ROS】ros-noetic和anaconda联合使用【教程】
【ROS】ros-noetic和anaconda联合使用【教程】 文章目录 【ROS】ros-noetic和anaconda联合使用【教程】1. 安装anaconda2. 创建虚拟环境3. 查看python解释器路径4. 在虚拟环境中使用任意的包5. 创建工作空间和ros功能包进行测试Reference 1. 安装anaconda 在Ubuntu20.04中安装…...
自动化RPA开发 --获取所有窗口信息和进程信息
场景 准备做一个RPA工具,可以从桌面和浏览器选择元素,获取窗口信息和进程信息是必要的,因为获取了窗口信息和进程,可用对程序做一些想要的操作。 coding 工具类 /*** Windows系统工具类*/ public class WinOsUtils {static fi…...

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用
在Qt中,布局管理器(Layout)用于管理窗口中的控件的位置和大小,以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI: 1. QVBoxLayout(垂直布…...

【计算机毕业设计】python在线课程培训学习考试系统637r7-PyCharm项目
使用说明 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 使用PyCharm 导入项目,修改配置,运行项目; 将项目中config.ini配置文件中的数据库配置改为自己的配置,…...

vue3后台管理系统之登录界面和业务的实现
1.静态页面的搭建 <template><div class"login_container"><el-row><el-col :span"12" :xs"0" /><el-col :span"12" :xs"24"><!-- 登录的表单 --><el-form ref"loginForms&qu…...

GEE19:基于Landsat8的常见的植被指数逐年获取
植被指数逐年获取 1. 常见的植被指数1.1 比值植被指数(Ratio vegetation index,RVI)1.2 归一化植被指数(Normalized Difference Vegetation Index,NDVI)1.3 增强植被指数(Enhanced Vegetation I…...
Python【多分支实际应用的练习】
要求:某商店T恤的价格为35元/件(2件9折,3件以上8折),裤子的价格为120 元/条(2条以上9折)小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱? 代码如下: tshirt_price 35 # T恤的单价 pan…...

LeetCode 343. 整数拆分(动态规划)
LeetCode 343. 整数拆分 思路: 通过题目我们可以知道,一个正整数最少拆成2个数,最多拆成n个数,即可拆分的个数为2~n 若将拆除的第一个正整数令为k,那么剩下的数则为n-k,此时可以不拆分&#x…...

C++对象模型(12)-- 构造函数语义学:构造函数
1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数,但在下列情况下,编译器会生成默认构造函数。 (1)该类没有任何构造函数,但包含一个类类型的成员变量,且成员变量所属的类有默认构造函数。 …...

[23] T^3Bench: Benchmarking Current Progress in Text-to-3D Generation
3D生成蓬勃发展,主流方法通过事例比较和用户调查来评价方法好坏,缺少客观比较指标;本文提出Bench,首次综合比较了不同生成方法;具体来说,本文设计了质量评估(Quality Assessment)和对…...