NodeJS3-2基础API----Buffer(缓冲器)

2023-12-29 16:58

本文主要是介绍NodeJS3-2基础API----Buffer(缓冲器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Buffer(缓冲器)

  • Buffer是用于处理二进制数据流的
  • 实例类似整数数组,大小固定(实例化之后,是多大就多大,不能进行变更)
  • C++代码在V8 对外分配物理内存
  • Buffer是全局变量,没必要使用require来引用
//常见一个规定长度,默认用0填充
console.log(Buffer.alloc(10));
console.log(Buffer.alloc(20));
// 用2填充
console.log(Buffer.alloc(5,2));
// 创建一个长度为 5、且未初始化的 Buffer。这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
console.log(Buffer.allocUnsafe(5,2));
console.log(Buffer.from([1,2,3]));
console.log(Buffer.from('test'));
//指定编码
console.log(Buffer.from('test','base64'));

运行结果

静态的属性和方法(Buffer类本身的属性和方法)[常用的]

Buffer.byteLength & Buffer.isBuffer() & Buffer.concat()

// 实际占了几个字节
console.log(Buffer.byteLength('test'));
//一个中文三个字节
console.log(Buffer.byteLength('测试'));
console.log(Buffer.isBuffer({}));
console.log(Buffer.isBuffer(Buffer.from([1,2,3])));
const buf1 = Buffer.from('This')
const buf2 = Buffer.from(' is ')
const buf3 = Buffer.from('a ')
const buf4 = Buffer.from('test ')
const buf5 = Buffer.from('!')
const buf = Buffer.concat([buf1,buf2,buf3,buf4,buf5])
console.log(buf.toString());

运行结果:

实例的常用属性和方法(6种)

buf.length      buf.toString()     buf.fill()

buf.equals()   buf.indexOf()      buf.copy()

//1.buf.length     
const buf = Buffer.from('This is a test!')
console.log(buf.length); //15
const buf2 = Buffer.alloc(10);
const buf3 = Buffer.allocUnsafe(10); //默认不填充
buf2[0]=2
//下面证明,就算默认不填充,可是长度是根据你一开始创建的大小来控制,与填不填充内容无关
console.log(buf2.length); //10
console.log(buf3.length); //10
//2.buf.toString() 
console.log(buf.toString()); //默认utf-8 This is a test
console.log(buf.toString('base64')); //VGhpcyBpcyBhIHRlc3Qh
//3.buf.fill() alloc是自动填充0,但是可以用fill()来填充其他的值
const buf4 = Buffer.allocUnsafe(10)
console.log(buf4);
console.log(buf4.fill(10,2,6));//fill(像填充的内容,从哪里开始,从哪里结束) 
//4.buf.equals()  两个Buffer的内容是否相等
const buf5  = Buffer.from('test')
const buf6  = Buffer.from('test')
const buf7  = Buffer.from('test!')
console.log(buf5.equals(buf6)); //true
console.log(buf5.equals(buf7)); //false
//5.buf.indexOf() buf5=test
console.log(buf5.indexOf('s')); //找到就返回所在位置的index(从0开始)
console.log(buf5.indexOf('a'));//找不到就返回-1
//6.buf.copy()
const buf8 = Buffer.allocUnsafe(10).fill('*')
const buf9 = Buffer.allocUnsafe(10).fill('!')
//拷贝'buf8'中第 3-6字节数据到'buf9'第4个偏移量开始
buf8.copy(buf9,4,3,6)
console.log(buf9.toString()); // !!!!***!!!
//乱码
const StringDecoder = require('string_decoder').StringDecoder
//自定义的decoder
const decoder = new StringDecoder('utf8')
const buf = Buffer.from('中文字符串!');
for(let i =0 ;i<buf.length ; i+=5){
const b = Buffer.allocUnsafe(5)
buf.copy(b,0,i)
console.log(b.toString());//乱码
}
for(let i =0 ;i<buf.length ; i+=5){
const b = Buffer.allocUnsafe(5)
buf.copy(b,0,i)
//用decoder来打印,决定打印的内容
console.log(decoder.write(b)); //没有乱码
}
//decoder并不会意识到自己处理中文(宽字节),
 

这篇关于NodeJS3-2基础API----Buffer(缓冲器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/550080

相关文章

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方