Node核心模块Buffer

201 阅读1分钟

基本概念

Buffer是Node挂载到global上的一个类。也就是内存,一个汉字在utf8编码下是三个字节。Buffer的变现形式是16进制。

创建Buffer的几种方式

  • Buffer.alloc () (传递长度,每一项都填成空位)
    let buf = Buffer.alloc(6);
    console.log(buf)
  • Buffer.allocUnsafe() // 超越总长度就无法拷贝了
  • Buffer.from() (可传递数组、字符串)
    let buf = Buffer.from('123131')
    let buf = Buffer.from([12,23,24])

Buffer的方法

  • Buffer.isBuffer()
  • buffer.slice() (截取出来的并不是新的内存,而是拿到的截出来的内存)
    let buf = Buffer.from([1,2,3])
    let newBuffer = buf.slice(0,1);
    newBuffer[0] = 10;
    console.log(buf) // <Buffer 0a 02 03>
  • buffer.copy()
    Buffer.prototype.copy = function(targetBuffer,targetStart,sourceStart = 0,sourceEnd = this.length){
        for(let i = 0;i<sourceEnd - sourceStart;i++){
            targetBuffer[targetStart + i] = this[sourceStart + i]
        }
    }
  • Buffer.concat()
    Buffer.concat = function(list,totalLength = list.reduce((a,b)=>a+b.length,0)){
        let buf = Buffer.alloc(totalLength);
        let offset = 0;
        list.forEach((b)=>{
            b.copy(buf,offset)
            offset += b.length;
        })
        return buf;
    }
  • buffer.split()
    Buffer.prototype.split = function(seq){
        let arr = [];
        let offset = 0;
        let current;
        let len = Buffer.from(seq).length;
        while(-1 !=(current = this.indexOf(seq,offset))){
            arr.push(this.slice(offset,current));
            offset = current + len;
        }
        arr.push(this.slice(offset))
        return arr;
    }