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

Buffer

时间:2023-04-03 17:08:06 Node.js

NodeAPI学习到的Buffer可以在TCP流或者文件系统操作等场景下处理二进制数据流。Buffer实例类似于整数数组,但Buffer的大小是固定的,物理内存分配在V8堆之外。Buffer的大小在创建时就确定了,不能调整。常用的Buffer类方法注意:(以下方法在新版Node中已经废弃,不推荐使用。)不推荐使用以下方法:newBuffer(array),newBuffer(arrayBuffer),newBuffer(buffer),newBuffer(大小),newBuffer(字符串)。替代方法如下:Buffer.from()、Buffer.alloc()、Buffer.allocUnsafe()。Buffer.from(array)返回一个新创建的Buffer,其中包含提供的字节数组的副本。letbuf1=Buffer.from([1,2,3,4])//letbuf2=Buffer.from([[0x62,0x75,0x66,0x66,0x65,0x72]])//buf2.toString()//'buffer'Buffer.from(arrayBuffer[,byteOffset[,length]])返回一个新创建的Buffer,它与给定的ArrayBuffer共享相同的内存。constarr=newUnit16Array(2)constbuf=Buffer.from(arr.buffer)//更改arr也会影响bufBuffer.from(buffer)返回一个新创建的Buffer,其中包含提供的Buffer内容的副本。letbuf1=Buffer.from('buffer')letbuf2=Buffer.from(buf1)buf1[0]=0x61console.log(buf1)//aufferconsole.log(buf2)//bufferBuffer.from(string[,encoding])返回一个新创建的缓冲区,其中包含所提供字符串的副本。Buffer.alloc(size[,fill[,encoding]])返回指定大小的填充Buffer实例。此方法将比Buffer.allocUnsafe(size)慢得多,但可确保新创建的Buffer实例永远不会包含陈旧和潜在的敏感数据。//size:新创建的Buffer的预期长度//fill:用于预填充新创建的Buffer的值,default:0//encoding:如果fill是字符串,那么这是字符编码,Default:utf-8constbuf=Buffer.alloc(5)//constbuf=Buffer.alloc(5,'a')//constbuf=Buffer.alloc(11,'aGVsbG8gd29ybGQ=','base64')//Output:helloworldBuffer.allocUnsafe(size)和Buffer.allocUnsafeSlow(size)返回一个新创建的指定大小的Buffer,但是它的内容必须是初始化后,您可以使用buf.fill(0)或完全填充它。开发人员应该将所有正在使用的newBuffer()构造函数迁移到新的API。是什么让Buffer.allocUnsafe()和Buffer.allocUnsafeSlow()不安全?因为调用这两个方法时,分配的内存是未初始化的(没有填充0),虽然这种设计使得内存的分配非常快(性能优势),但是分配的内存段可能包含潜在的敏感旧数据。使用由Buffer.allocUnsafe()创建的尚未完全覆盖内存的Buffer可能会在Buffer内存可读时泄漏其旧数据。Buffer和字符编码可以通过指定的编码系统在Buffer和普通字符串之间进行转换。目前支持ascii,utf-8,base-64,binary,hexconstbuf=Buffer.from('helloworld','ascii')buf.toString('hex')buf.toString('base64')BufferwithES6iteration类似,可以使用迭代器for...of遍历Buffer实例,可以使用遍历器的buf.values()、buf.keys()、buf.entries()创建迭代器。constbuf=Buffer.from([1,2,3])for(letbofbuf){console.log(b)//123}类方法Buffer.byteLength(string[,encoding])返回一个字符字符串的实际字节长度。String.prototype.length是返回字符串中的字符数。注意字符数和字节长度是不同的,在英文字母中是一样的,但是在有中文或unicode编码的时候就不一样了(用两个字节来编码一个字符)。'Chinesehello'.length//7Buffer.byteLength('Chinesehello','uft-8')//11Buffer.compare(buf1,buf2)通常用于对Buffer实例数组进行排序。(有点像sort()方法)Buffer.concat(list[,totalLength])mergeBufferconstbuf1=Buffer.alloc(10)constbuf2=Buffer.alloc(14)constbuf3=Buffer.alloc(18)consttotalLength=buf1.length+buf2.length+buf3.length//42constbufA=Buffer.concat([buf1,buf2,buf3],41)//截断为totalLength的长度,缺失的部分将补上00cosnole。log(buf.length)//41Buffer.isBuffer(obj),是一个缓冲区,返回trueBuffer.isEncoding(encoding),是一个支持的字符编码,返回trueBuffer.entries(),在[index,byte]的形式=Buffer.from('buffer')for(letpairofbuf.entries()){console.log(pair)//[0,98],[1,117]...}buf.equals(otherBuffer),如果buf与otherBuffer具有完全相同的字节,则返回true