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资源管理器经常卡死(后升级小版本好多了)。 遂长按电源键强制关机重启。 然慢慢又越来越卡,直至卡死,无…...
GTE中文文本嵌入模型部署案例:中小企业文档去重降本提效
GTE中文文本嵌入模型部署案例:中小企业文档去重降本提效 1. 项目背景与价值 中小企业日常运营中会产生大量文档资料,包括合同文件、产品说明、客户沟通记录、内部报告等。这些文档往往存在重复内容,导致存储空间浪费、信息检索困难、管理成…...
KeyDecoder项目架构分析:理解Flutter应用的数据流与状态管理
KeyDecoder项目架构分析:理解Flutter应用的数据流与状态管理 【免费下载链接】KeyDecoder KeyDecoder app lets you use your smartphone or tablet to decode your mechanical keys in seconds. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyDecoder Ke…...
Phi-3-Mini-128K高并发服务架构设计:负载均衡与自动扩缩容策略
Phi-3-Mini-128K高并发服务架构设计:负载均衡与自动扩缩容策略 你是不是也遇到过这种情况?自己部署的AI模型服务,平时用着挺好,一旦用户量稍微上来点,或者有人发了个长请求,服务就卡死甚至直接挂掉。然后就…...
戴森V6/V7吸尘器电池锁死终极解决方案:开源固件修复完整指南
戴森V6/V7吸尘器电池锁死终极解决方案:开源固件修复完整指南 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 您的戴森吸尘器突…...
Python AI模型推理慢?3个被90%工程师忽略的代码级优化技巧,立竿见影提升3.2倍吞吐量
第一章:Python AI模型推理慢?3个被90%工程师忽略的代码级优化技巧,立竿见影提升3.2倍吞吐量避免动态类型推断导致的重复开销 Python 的动态类型在模型推理中常引发隐式类型转换和属性查找开销。尤其在循环内调用 model.forward() 时ÿ…...
清华团队ISSCC新作解读:用eDRAM-LUT做存内计算,如何把存储单元变成加法器?
清华团队ISSCC新作:eDRAM-LUT如何重构存内计算芯片设计范式 当人工智能模型的参数量突破千亿级别时,传统计算架构的"存储墙"问题愈发凸显。数据在存储器和处理器之间的频繁搬运,消耗了系统60%以上的能耗——这恰恰是存内计算技术试…...
C++的std--ranges适配器视图元素类型推导规则与用户自定义类型
C20引入的std::ranges库彻底改变了序列操作的范式,其中适配器视图通过惰性求值和管道操作符实现了高效的函数式编程。当开发者尝试将用户自定义类型融入这套体系时,元素类型推导的复杂规则往往成为技术深水区。本文将揭示适配器视图背后的类型魔法&#…...
OpenRocket完全指南:如何免费设计并仿真你的第一枚模型火箭[特殊字符]
OpenRocket完全指南:如何免费设计并仿真你的第一枚模型火箭🚀 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 你是否曾经梦想设计自…...
Switch大气层系统高级配置实战:5个专业技巧打造安全高效的自定义环境
Switch大气层系统高级配置实战:5个专业技巧打造安全高效的自定义环境 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层(Atmosphere)作为任天堂Swit…...
YOLOv8模型训练避坑指南:GTX16系列显卡兼容性问题解决方案
GTX16系列显卡用户必读:YOLOv8模型训练全流程避坑手册 当你在GTX16系列显卡上运行YOLOv8训练脚本时,是否遇到过这样的场景:训练过程看似正常,但最终输出的P(精确率)、R(召回率)、mAP…...
