自定义Buffer方法

日期: 2020-05-06 20:37 浏览次数 :

时间: 2019-12-22阅读: 70标签: 方法

官网API地址:http://nodejs.cn/api/buffer.html

Buffer类,是用来创建一个特意贮存二进制数据的缓存区。每当需求管理二进制数据时,就有非常大大概行使到Buffer类。

1、Buffer.alloc(size[, fill[, encoding]])

新建叁个Buffer实例,传入的多少个参数分别为内存上抽成的大大小小,填充的源委,编码格式,默以为utf8。

1.Buffer的常用方法1.1 Buffer.alloc(卡塔尔

2、Buffer.allocUnsafe(size卡塔尔(قطر‎ 平常不提议接收

以这种艺术开创的 Buffer实例的底部内部存款和储蓄器是未起头化的。 新创制的 Buffer的剧情是不解的,且想必含有敏感数据
能够采纳 buf.fill(0)初始化 Buffer实例为0。

用来声称一段固定大小的Buffer实例,若无设置fill,则暗许填满0

3、Buffer.from()

参数能够流传一个数组,字符串等等,详细用法见官方网址api

let buffer = Buffer.alloc(6);console.log(buffer);//Buffer 00 00 00 00 00 00

4、Buffer.byteLength(string[, encoding])

归来叁个字符串的实际上字节长度,第四个参数为要总计长度的值,第叁个参数为字符编码,默感觉utf8

1.2 Buffer.from()

5、Buffer.isBuffer(obj)

决断传入参数是或不是为一个Buffer对象

let buffer = Buffer.from('前端优选');console.log(buffer);//Buffer e5 89 8d e7 ab af e4 bc 98 e9 80 89

6、Buffer.concat(list[, totalLength])

回去多个联结了 list 中有着 Buffer 实例的新建的 Buffer 。
第1个参数是多少个数组,比如:[buf1, buf2, buf3]
其次个参数为统有的时候 list 中 Buffer 实例的总参谋长度。若无提供 totalLength ,则从 list 中的 Buffer 实例总括取得。 为了总结 totalLength 会导致急需实行额外的大循环,所以提供生硬的长度会运作更加快。

该结果重返的是十三进制、UTF-8编码格式的字节

7、buf.length

回到Buffer实例对象在字节数上分红的内部存款和储蓄器量。 注意,那并不一定反映 buf 内可用的数据量。

1.3 buffer.toString([encoding[,start[,end]]])

8、buf.toString([encoding[, start[, end]]])

根据 encoding 钦命的字符编码解码 buf 成一个字符串。 start 和 end 可传唱用于只解码 buf 的一片段。

//接上个例子console.log(newBuff.toString());//前端

9、buf.fill(value[, offset[, end]][, encoding])

先是个入参value为填充buf的值,第二和第七个参数为填充开首和终止的岗位,借使不传,默以为整个填写。第四个参数为value的字符编码。

toString暗中认可使用的编码是uft8,再次回到钦赐编码的字符串;该办法还可钦命读取索引的序曲截至地点

10、buf.equals(otherBuffer)

相比较七个Buffer实例对象,若是 buf 与 otherBuffer 具有完全相仿的字节,则赶回 true,否则再次来到 false。

1.4 buffer.length

11、buf.indexOf(value[, byteOffset][, encoding])

率先个参数为急需探究的值,第叁个参数为搜索的起头地点, 默以为0。

let buffer = Buffer.from('前端优选');let length = buffer.length;console.log(length);//12

12、buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

率先个参数为要拷贝进的 Buffer。

回到的是内部存款和储蓄器镇长度;贰个男人汉富含八个字节,则结果正是4*3=18个字节长度

1.5 Buffer.isBuffer()

let buffer = Buffer.from('前端优选');let result = Buffer.isBuffer(buffer);//true

认清一个值是或不是为Buffer类型,再次回到的结果为布尔值

1.6 buffer.slice(start[,end])

let buffer = Buffer.from('前端优选');let result = buffer.slice(6,12);console.log(result.toString());//优选

回去一个新的buffer值,和原有值指向同一个内部存款和储蓄器区

1.7 buffer.indexOf()

let buffer = Buffer.from('前端优选');let index = buffer.indexOf('优选');console.log(index);//6

归来字符串的内部存款和储蓄器初始地点

1.8 Buffer.concat(list[,length])

let buffer1 = Buffer.from('前端');let buffer2 = Buffer.from('优选');let buffer3 = Buffer.concat([buffer1,buffer2]);console.log(buffer3);console.log(buffer3.toString());//Buffer e5 89 8d e7 ab af e4 bc 98 e9 80 89//前端优选

回去的值是两个分子归总的新Buffer对象

1.9 buffer.copy(target[,targetStart[,sourceStart[,sourceEnd]]])

点名要拷贝的对象,从目的起先地点上马,拷贝源buffer的内定开端和了结地点之间的字符该方法未有再次来到值,直接对target实行操作

let buff1 = Buffer.from('前端');let buff2 = Buffer.from('优选');buff1.copy(buff2,0,0,3);console.log(buff2.toString());//前选(从buff2的0位置起始,拷贝buff1的0-3位置之间的字符,操作对象为buff2)

2.Buffer的特点

Buffer是援用的内部存款和储蓄器空间,换句话说便是援用类型的值,不管是截取或改变,都以对内部存款和储蓄器空间的改造,因而都会变动原本的值。

let buffer = Buffer.from([11,12,13]);let newBuff = buffer.slice(0,3);newBuff[0] = 100;console.log(buffer);//Buffer 64 0c 0d

3.Buffer自定义方法3.1 split方法

let buffer = Buffer.from('前爱端爱优爱选');let res = buffer.split('爱');//期望输出结果:['前','端','优','选'];

那么须求自定义二个split方法

Buffer.prototype.split = function(step){ let arr = []; return arr;}

先是,须要吸取分割字符串的长度

letlen = Buffer.from(step).length;

附带,钦命每一趟的分割初步地点

letoffset=0;//初次分割从0开始,然后依次累加

然后,记录当前区划地点,将已分割和剪切字符的长度求和

let current =this.indexOf(step,offset);

对细分的开场地点张开更新

offset= current + len;

巡回遍历,直到询问截至截至

while(-1 != this.indexOf(step,offset)){ current = this.indexOf(step,offset); arr.push(this.slice(offset,current)); offset = current + len;}

末尾方法为:

Buffer.prototype.split = function(step){ let len = Buffer.from(step).length; let offset = 0; let current = 0; let arr = []; while(-1 != this.indexOf(step,offset)){ current = this.indexOf(step,offset); arr.push(this.slice(offset,current)); offset = current + len; } arr.push(this.slice(offset)); //将剩余结果进行添加 return arr.map(item = item.toString());}

3.2 手动实现Buffer的concat方法

率先看concat的行使方法

let buff1 = Buffer.from('前端');let buff2 = Buffer.from('优选');let buff3 = Buffer.concat([buff1,buff2]);console.log(buff3.toString());//前端优选

分析:该办法起码要求传递三个参数:用于归拢的数组列表(必填)、钦定归拢后的总参谋长度(可选)

Buffer.concat = function(list,length=list.reduce((a,b) = a+b.length,0){ //通过对list的长度求和,计算指定长度 let buffer = Buffer.alloc(length); let offset = 0; list.forEach(item = { item.copy(buffer,0); //利用copy方法,依次复制 offset += item.length; //更新每次的复制指针 }) return buffer;}

4.总结

Buffer存在于全局对象上,是一定要打听和通晓的知识。Buffer是在内部存款和储蓄器中开拓一片区域,用来存放在二进制数据,在文书的读取和传导上,有着主要的效应。

原文: