广告
返回顶部
首页 > 资讯 > 精选 >Nodejs中有哪些Buffer模块的API
  • 641
分享到

Nodejs中有哪些Buffer模块的API

2023-06-15 01:06:15 641人浏览 泡泡鱼
摘要

这篇文章给大家介绍nodejs中有哪些Buffer模块的api,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。模块概览Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写、网络请求数据的处

这篇文章给大家介绍nodejs中有哪些Buffer模块的api,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

模块概览

Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写、网络请求数据的处理等。

Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包括Buffer实例的创建、比较、连接、拷贝、查找、遍历、类型转换、截取、编码转换等。【推荐学习:《nodejs 教程》】

创建

  • new Buffer(array)

  • Buffer.alloc(length)

  • Buffer.allocUnsafe(length)

  • Buffer.from(array)

通过 new Buffer(array)

// Creates a new Buffer containing the ASCII bytes of the string 'buffer'const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);

验证下:

var array = 'buffer'.split('').map(function(v){    return '0x' + v.charCodeAt(0).toString(16)});console.log( array.join() );// 输出:0x62,0x75,0x66,0x66,0x65,0x72

通过 Buffer.alloc(length)

var buf1 = Buffer.alloc(10);  // 长度为10的buffer,初始值为0x0var buf2 = Buffer.alloc(10, 1);  // 长度为10的buffer,初始值为0x1
var buf3 = Buffer.allocUnsafe(10);  // 长度为10的buffer,初始值不确定
var buf4 = Buffer.from([1, 2, 3])  // 长度为3的buffer,初始值为 0x01, 0x02, 0x03

通过Buffer.from()

例子一:Buffer.from(array)

// [0x62, 0x75, 0x66, 0x66, 0x65, 0x72] 为字符串 "buffer" // 0x62 为16进制,转成十进制就是 98,代表的就是字母 bvar buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);console.log(buf.toString());

例子二:Buffer.from(string[, encoding])

通过string创建buffer,跟将buffer转成字符串时,记得编码保持一致,不然会出现乱码,如下所示。

var buf = Buffer.from('this is a tést');  // 默认采用utf8// 输出:this is a téstconsole.log(buf.toString());  // 默认编码是utf8,所以正常打印// 输出:this is a tC)stconsole.log(buf.toString('ascii'));  // 转成字符串时,编码不是utf8,所以乱码

对乱码的分析如下:

var letter = 'é';var buff = Buffer.from(letter);  // 默认编码是utf8,这里占据两个字节 <Buffer c3 a9>var len = buff.length;  // 2var code = buff[0]; // 第一个字节为0xc3,即195:超出ascii的最大支持范围var binary = code.toString(2);  // 195的二进制:10101001var finalBinary = binary.slice(1);  // 将高位的1舍弃,变成:0101001var finalCode = parseInt(finalBinary, 2);  // 0101001 对应的十进制:67var finalLetter = String.fromCharCode(finalCode);  // 67对应的字符:C// 同理 0xa9最终转成的ascii字符为)// 所以,最终输出为 this is a tC)st

例子三:Buffer.from(buffer)

创建新的Buffer实例,并将buffer的数据拷贝到新的实例子中去。

var buff = Buffer.from('buffer');var buff2 = Buffer.from(buff);console.log(buff.toString());  // 输出:bufferconsole.log(buff2.toString());  // 输出:bufferbuff2[0] = 0x61;console.log(buff.toString());  // 输出:bufferconsole.log(buff2.toString());  // 输出:auffer

buffer比较

buf.equals(otherBuffer)

判断两个buffer实例存储的数据是否相同,如果是,返回true,否则返回false。

// 例子一:编码一样,内容相同var buf1 = Buffer.from('A');var buf2 = Buffer.from('A');console.log( buf1.equals(buf2) );  // true// 例子二:编码一样,内容不同var buf3 = Buffer.from('A');var buf4 = Buffer.from('B');console.log( buf3.equals(buf4) );  // false// 例子三:编码不一样,内容相同var buf5 = Buffer.from('ABC');  // <Buffer 41 42 43>var buf6 = Buffer.from('414243', 'hex');console.log(buf5.equals(buf6));    //true//只要比较的两者内容相同,`buf.equals(otherBuffer)` 就返回true

buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])

同样是对两个buffer实例进行比较,不同的是:

  • 可以指定特定比较的范围(通过start、end指定)

  • 返回值为整数,达标buf、target的大小关系

假设返回值为

  • 0:buf、target大小相同。

  • 1:buf大于target,也就是说buf应该排在target之后。

  • -1:buf小于target,也就是说buf应该排在target之前。

看例子,官方的例子挺好的,直接贴一下:

const buf1 = Buffer.from('ABC');const buf2 = Buffer.from('BCD');const buf3 = Buffer.from('ABCD');// Prints: 0console.log(buf1.compare(buf1));// Prints: -1console.log(buf1.compare(buf2));// Prints: -1console.log(buf1.compare(buf3));// Prints: 1console.log(buf2.compare(buf1));// Prints: 1console.log(buf2.compare(buf3));// Prints: [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]// (This result is equal to: [buf1, buf3, buf2])console.log([buf1, buf2, buf3].sort(Buffer.compare));

Buffer.compare(buf1, buf2)

buf.compare(target) 大同小异,一般用于排序。直接贴官方例子:

const buf1 = Buffer.from('1234');const buf2 = Buffer.from('0123');const arr = [buf1, buf2];// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]// (This result is equal to: [buf2, buf1])console.log(arr.sort(Buffer.compare));

从Buffer.from([62])谈起

这里稍微研究下Buffer.from(array)。下面是官方文档对API的说明,也就是说,每个array的元素对应1个字节(8位),取值从0到255。

Allocates a new Buffer using an array of octets.

数组元素为数字

首先看下,传入的元素为数字的场景。下面分别是10进制、8进制、16进制,跟预期中的结果一致。

var buff = Buffer.from([62])// <Buffer 3e>// buff[0] === parseInt('3e', 16) === 62
var buff = Buffer.from([062])// <Buffer 32>// buff[0] === parseInt(62, 8) === parseInt(32, 16) === 50
var buff = Buffer.from([0x62])// <Buffer 62>// buff[0] === parseInt(62, 16) === 98

数组元素为字符串

再看下,传入的元素为字符串的场景。

  • 0开头的字符串,在parseInt('062')时,可以解释为62,也可以解释为50(八进制),这里看到采用了第一种解释。

  • 字符串的场景,跟parseInt()有没有关系,暂未深入探究,只是这样猜想。TODO(找时间研究下)

var buff = Buffer.from(['62'])// <Buffer 3e>// buff[0] === parseInt('3e', 16) === parseInt('62') === 62
var buff = Buffer.from(['062'])// <Buffer 3e>// buff[0] === parseInt('3e', 16) === parseInt('062') === 62
var buff = Buffer.from(['0x62'])// <Buffer 62>// buff[0] === parseInt('62', 16) === parseInt('0x62') === 98

数组元素大小超出1个字节

感兴趣的同学自行探究。

var buff = Buffer.from([256])// <Buffer 00>

Buffer.from('1')

一开始不自觉的会将Buffer.from('1')[0]"1"划等号,其实"1"对应的编码是49。

var buff = Buffer.from('1')  // <Buffer 31>console.log(buff[0] === 1)  // false

这样对比就知道了,编码为1的是个控制字符,表示 Start of Heading。

console.log( String.fromCharCode(49) )  // '1'console.log( String.fromCharCode(1) )  // '\u0001'

buffer连接:Buffer.concat(list[, totalLength])

备注:个人觉得totalLength这个参数挺多余的,从官方文档来看,是处于性能提升的角度考虑。不过内部实现也只是遍历list,将length累加得到totalLength,从这点来看,性能优化是几乎可以忽略不计的。

var buff1 = Buffer.alloc(10);var buff2 = Buffer.alloc(20);var totalLength = buff1.length + buff2.length;console.log(totalLength);  // 30var buff3 = Buffer.concat([buff1, buff2], totalLength);console.log(buff3.length);  // 30

除了上面提到的性能优化,totalLength还有两点需要注意。假设list里面所有buffer的长度累加和为length

  • totalLength > length:返回长度为totalLength的Buffer实例,超出长度的部分填充0。

  • totalLength < length:返回长度为totalLength的Buffer实例,后面部分舍弃。

var buff4 = Buffer.from([1, 2]);var buff5 = Buffer.from([3, 4]);var buff6 = Buffer.concat([buff4, buff5], 5);console.log(buff6.length);  // console.log(buff6);  // <Buffer 01 02 03 04 00>var buff7 = Buffer.concat([buff4, buff5], 3);console.log(buff7.length);  // 3console.log(buff7);  // <Buffer 01 02 03>

拷贝:buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

使用比较简单,如果忽略后面三个参数,那就是将buf的数据拷贝到target里去,如下所示:

var buff1 = Buffer.from([1, 2]);var buff2 = Buffer.alloc(2);buff1.copy(buff2);console.log(buff2);  // <Buffer 01 02>

另外三个参数比较直观,直接看官方例子

const buf1 = Buffer.allocUnsafe(26);const buf2 = Buffer.allocUnsafe(26).fill('!');for (let i = 0 ; i < 26 ; i++) {  // 97 is the decimal ASCII value for 'a'  buf1[i] = i + 97;}buf1.copy(buf2, 8, 16, 20);// Prints: !!!!!!!!qrst!!!!!!!!!!!!!console.log(buf2.toString('ascii', 0, 25));

查找:buf.indexOf(value[, byteOffset][, encoding])

数组的查找差不多,需要注意的是,value可能是String、Buffer、Integer中的任意类型。

  • String:如果是字符串,那么encoding就是其对应的编码,默认是utf8。

  • Buffer:如果是Buffer实例,那么会将value中的完整数据,跟buf进行对比。

  • Integer:如果是数字,那么value会被当做无符号的8位整数,取值范围是0到255。

另外,可以通过byteOffset来指定起始查找位置。

直接上代码,官方例子妥妥的,耐心看完它基本就理解得差不多了。

const buf = Buffer.from('this is a buffer');// Prints: 0console.log(buf.indexOf('this'));// Prints: 2console.log(buf.indexOf('is'));// Prints: 8console.log(buf.indexOf(Buffer.from('a buffer')));// Prints: 8// (97 is the decimal ASCII value for 'a')console.log(buf.indexOf(97));// Prints: -1console.log(buf.indexOf(Buffer.from('a buffer example')));// Prints: 8console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');// Prints: 4console.log(utf16Buffer.indexOf('\u03a3', 0, 'ucs2'));// Prints: 6console.log(utf16Buffer.indexOf('\u03a3', -4, 'ucs2'));

写:buf.write(string[, offset[, length]][, encoding])

将sring写入buf实例,同时返回写入的字节数。

参数如下:

  • string:写入的字符串。

  • offset:从buf的第几位开始写入,默认是0。

  • length:写入多少个字节,默认是 buf.length - offset。

  • encoding:字符串的编码,默认是utf8。

看个简单例子

var buff = Buffer.alloc(4);buff.write('a');  // 返回 1console.log(buff);  // 打印 <Buffer 61 00 00 00>buff.write('ab');  // 返回 2console.log(buff);  // 打印 <Buffer 61 62 00 00>

填充:buf.fill(value[, offset[, end]][, encoding])

value填充buf,常用于初始化buf。参数说明如下:

  • value:用来填充的内容,可以是Buffer、String或Integer。

  • offset:从第几位开始填充,默认是0。

  • end:停止填充的位置,默认是 buf.length。

  • encoding:如果value是String,那么为value的编码,默认是utf8。

例子:

var buff = Buffer.alloc(20).fill('a');console.log(buff.toString());  // aaaaaaaaaaaaaaaaaaaa

转成字符串: buf.toString([encoding[, start[, end]]])

把buf解码成字符串,用法比较直观,看例子

var buff = Buffer.from('hello');console.log( buff.toString() );  // helloconsole.log( buff.toString('utf8', 0, 2) );  // he

转成JSON字符串:buf.toJSON()

var buff = Buffer.from('hello');console.log( buff.toJSON() );  // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }

遍历:buf.values()、buf.keys()、buf.entries()

用于对buf进行for...of遍历,直接看例子。

var buff = Buffer.from('abcde');for(const key of buff.keys()){    console.log('key is %d', key);}// key is 0// key is 1// key is 2// key is 3// key is 4for(const value of buff.values()){    console.log('value is %d', value);}// value is 97// value is 98// value is 99// value is 100// value is 101for(const pair of buff.entries()){    console.log('buff[%d] === %d', pair[0], pair[1]);}// buff[0] === 97// buff[1] === 98// buff[2] === 99// buff[3] === 100// buff[4] === 101

截取:buf.slice([start[, end]])

用于截取buf,并返回一个新的Buffer实例。需要注意的是,这里返回的Buffer实例,指向的仍然是buf的内存地址,所以对新Buffer实例的修改,也会影响到buf。

var buff1 = Buffer.from('abcde');console.log(buff1);  // <Buffer 61 62 63 64 65>var buff2 = buff1.slice();console.log(buff2);  // <Buffer 61 62 63 64 65>var buff3 = buff1.slice(1, 3);console.log(buff3);  // <Buffer 62 63>buff3[0] = 97;  // parseInt(61, 16) ==> 97console.log(buff1);  // <Buffer 62 63>

TODO

  • 创建、拷贝、截取、转换、查找

  • buffer、arraybuffer、dataview、typedarray

  • buffer vs 编码

  • Buffer.from()、Buffer.alloc()、Buffer.alocUnsafe()

  • Buffer vs TypedArray

关于Nodejs中有哪些Buffer模块的API就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Nodejs中有哪些Buffer模块的API

本文链接: https://www.lsjlt.com/news/276547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Nodejs中有哪些Buffer模块的API
    这篇文章给大家介绍Nodejs中有哪些Buffer模块的API,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。模块概览Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写、网络请求数据的处...
    99+
    2023-06-15
  • Nodejs常用文件fs模块API有哪些
    这篇文章主要介绍Nodejs常用文件fs模块API有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!同步与异步fs模块的文件操作一般支持同步和异步两种API,异步又包括了回调函数和...
    99+
    2022-10-19
  • Nodejs中的buffer模块怎么使用
    这篇文章主要介绍“Nodejs中的buffer模块怎么使用”,在日常操作中,相信很多人在Nodejs中的buffer模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • Nodejs中Buffer模块的用法是什么
    这篇文章主要介绍“Nodejs中Buffer模块的用法是什么”,在日常操作中,相信很多人在Nodejs中Buffer模块的用法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • nodejs的核心模块有哪些
    这篇文章主要介绍“nodejs的核心模块有哪些”,在日常操作中,相信很多人在nodejs的核心模块有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nodejs的核心模块有...
    99+
    2022-10-19
  • nodejs常用模块有哪些
    Node.js常用的模块有:1. http:用于创建HTTP服务器和处理HTTP请求2. fs:用于文件系统操作,包括读取、写入、删...
    99+
    2023-10-10
    nodejs
  • nodejs内置模块有哪些
    nodejs内置模块有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、path模块 用于处理文件路径。path.normalize(路径解析,得到规范路径);p...
    99+
    2023-06-14
  • Nodejs开发中常用的模块有哪些
    这篇文章主要介绍Nodejs开发中常用的模块有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MVC框架 - ExpressExpress 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站。Expre...
    99+
    2023-06-14
  • node中path路径模块的API有哪些
    本文小编为大家详细介绍“node中path路径模块的API有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“node中path路径模块的API有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2022-10-19
  • nodejs中哪个模块提供文件操作api
    本篇文章给大家分享的是有关nodejs中哪个模块提供文件操作api,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在nodejs中,文件系统模块...
    99+
    2022-10-19
  • NodeJS模块与ES6模块系统语法及注意点有哪些
    这篇文章主要介绍了NodeJS模块与ES6模块系统语法及注意点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。社区模块规范:1.Comm...
    99+
    2022-10-19
  • Docker中Speedy的模块有哪些
    这篇“Docker中Speedy的模块有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Docker中Speedy的模块有...
    99+
    2023-06-27
  • Burpsuite的模块有哪些
    本篇内容介绍了“Burpsuite的模块有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!端口即服务,每一个服务对应一个或多个端口。端口扫...
    99+
    2023-06-03
  • python中有哪些模块类
    本篇文章给大家分享的是有关python中有哪些模块类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
  • tf.keras.layers模块中的函数有哪些
    本文小编为大家详细介绍“tf.keras.layers模块中的函数有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“tf.keras.layers模块中的函数有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • python中有哪些常用的模块
    python中有哪些常用的模块,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python是一种面向对象、直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具...
    99+
    2023-06-17
  • python中有哪些包和模块
    这篇文章将为大家详细讲解有关python中有哪些包和模块,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.scrapy;...
    99+
    2023-06-14
  • python中有哪些异常模块
    这篇文章给大家介绍python中有哪些异常模块,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均为Python开发。3...
    99+
    2023-06-14
  • Python中有哪些模块类型
    本篇文章给大家分享的是有关Python中有哪些模块类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。内置标准模块,又称为标准库,如 sys、time、math、json 模块等...
    99+
    2023-06-15
  • Python中os模块的功能有哪些
    今天就跟大家聊聊有关Python中os模块的功能有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、说明os.path.exists():用于判断某个路径(文件或文件夹)是否存在...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作