当前位置: 首页 > 后端技术 > Node.js

自定义Buffer方法

时间:2023-04-03 23:38:09 Node.js

Buffer类用于创建一个专门用于存储二进制数据的缓冲区。每当需要处理二进制数据时,都可以使用Buffer类。一、Buffer的常用方法1.1Buffer.alloc()用于声明一个固定大小的Buffer实例。如果不设置fill,则默认填充。0letbuffer=Buffer.alloc(6);console.log(buffer);//1.2Buffer.from()letbuffer=Buffer.from('前端首选');console.log(buffer);//结果以十六进制和UTF-8编码格式返回字节1.3buffer.toString([encoding[,start[,end]]])//接上例console.log(newBuff.toString());//前端toString默认使用的编码为uft8,返回指定编码的字符串;该方法还可以指定读取索引的起止位置1.4buffer.lengthletbuffer=Buffer.from('Front-endpreferred');letlength=buffer.length;console.log(length);//12returns内存区域的长度;一个man包含三个字节,结果是4*3=12个字节length1.5Buffer.isBuffer()letbuffer=Buffer.from('Front-endpreferred');letresult=Buffer.isBuffer(buffer);//true判断一个值是否为Buffer类型,返回结果为布尔值1.6buffer.slice(start[,end])letbuffer=Buffer.from('前端首选');letresult=buffer.slice(6,12);console.log(result.toString());//最好返回一个新的buffer值,和原来有值指向同一个内存区1.7buffer.indexOf()letbuffer=Buffer.from('前端首选');letindex=buffer.indexOf('首选');console.log(index);//6返回回到字符串的内存起始位置1.8Buffer.concat(list[,length])letbuffer1=Buffer.from('frontend');letbuffer2=Buffer.from('optimal');letbuffer3=Buffer.concat([buffer1,buffer2]);console.log(buffer3);console.log(buffer3.toString());////首选返回值通过前端是一个新的多个成员合并的Buffer对象1.9buffer.copy(target[,targetStart[,sourceStart[,sourceEnd]]])指定要复制的目标,从目标的起始位置开始,复制指定源缓冲区的起始和结束位置该方法之间的字符没有返回值,直接对目标进行操作letbuff1=Buffer.from('frontend');letbuff2=Buffer.from('preferred');buff1.copy(buff2,0,0,3);console.log(buff2.toString());//预选(从buff2的0位置开始,复制buff1的0-3位置之间的字符,操作对象是buff2)2.BufferBuffer的特点是引用的内存空间,换句话说,引用类型的值,无论是截取还是改变,都是对内存空间的修改,所以原来的值会被改变letbuffer=Buffer.from([11,12,13]);letnewBuff=buffer.slice(0,3);newBuff[0]=100;console.log(buffer);//3.Buffer自定义方法3.1split方法letbuffer=Buffer.from('Qianaiduanaiyouaixuan');letres=buffer.split('love');//预期输出结果:['qian','End','Excellent','选择'];然后需要自定义一个split方法Buffer.prototype.split=function(step){letarr=[];returnarr;}首先需要得到拆分后的字符串Lengthletlen=Buffer.from(step).length;其次,指定每个分区的起始位置letoffset=0;//初始划分从0开始,然后依次累加然后,记录当前划分位置,划分划分和划分字符的长度求和letcurrent=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){letlen=Buffer.from(step).length;让偏移量=0;让当前=0;让arr=[];while(-1!=this.indexOf(step,offset)){current=this.indexOf(步骤,偏移量);arr.push(this.slice(offset,cu租金));偏移量=当前+长度;}arr.push(this.slice(offset));//把剩下的结果相加returnarr.map(item=>item.toString());}3.2手动实现Buffer的concat方法先看concat的用法letbuff1=Buffer.from('frontend');letbuff2=Buffer.from('preferred');letbuff3=Buffer.concat([buff1,buff2]);console.log(buff3.toString());//前端优化分析:该方法需要通过at至少两个参数:用于合并的数组列表(必填),指定合并后的总长度(可选)Buffer.concat=function(list,length=list.reduce((a,b)=>a+b.length,0){//通过对列表的长度求和计算指定的长度letbuffer=Buffer.alloc(length);letoffset=0;list.forEach(item=>{item.copy(buffer,0);//使用copy方法依次复制offset+=item.length;//每次都更新copy指针})returnbuffer;}4.总结Buffer存在于全局对象上,这是必须要了解和掌握的知识Buffer开在内存中开辟一块区域存放二进制数据,在文件读取和传输中起着重要作用。