Node进阶 ---- Buffer

2018-08-23  本文已影响0人  _小山楂

1. 什么是Buffer

2. 什么是字节

进制

3. 定义buffer的三种方式

3.1 通过长度定义buffer

// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 创建一个长度为 10、且未初始化的 Buffer。
const buf3 = Buffer.allocUnsafe(10);

3.2 通过数组定义buffer

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);

正常情况下为0-255之间;

3.3 字符串创建

const buf5 = Buffer.from('张熙沐枫');

4.buffer常用方法

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

手动初始化,擦干净桌子,将buffer内容清0

buffer.fill(0);

4.2 write方法

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

buffer.write('沐',0,3,'utf8');
buffer.write('枫',3,3,'utf8'); //沐枫

4.3 writeInt8

var buf = new Buffer(4);
buf.writeInt8(0,0);
buf.writeInt8(16,1);
buf.writeInt8(32,2);
buf.writeInt8(48,3);//16*3*/
console.log(buf);
console.log(buf.readInt8(0));
console.log(buf.readInt8(1));
console.log(buf.readInt8(2));
console.log(buf.readInt8(3));

4.3.1 Little-Endian&Big-Endian

不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序。

4.3 toString方法

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

buffer.toString('utf8',3,6)

4.4 slice方法 [#](#t134.4 slice方法)

buf.slice([start[, end]])

let newBuf = buffer.slice(0,4);

4.4.1 截取乱码问题

let {StringDecoder}  = require('string_decoder');
let sd = new StringDecoder();
let buffer = new Buffer('沐枫');
console.log(sd.write(buffer.slice(0,4)));
console.log(sd.write(buffer.slice(4)));

4.5 copy方法

复制Buffer 把多个buffer拷贝到一个大buffer上

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
let buf5 = Buffer.from('张熙沐枫');
let buf6 = Buffer.alloc(6);
buf5.copy(buf6,0,0,4);
buf5.copy(buf6,3,3,6);
//buf6=沐枫
Buffer.prototype.copy2 = function(targetBuffer,targetStart,sourceStart,sourceEnd){
    for(let i=sourceStart;i<sourceEnd;i++){
        target[targetStart+i] = this[i];
    }
}

4.6 concat方法

Buffer.concat(list[, totalLength])
let buf1 = Buffer.from('沐');
let buf2 = Buffer.from('枫');
let buf3 = Buffer.concat([buf1,buf2],3);
console.log(buf3.toString());
Buffer.concat2 = function (list = [], total = list.reduce((len, item) => len + item.length, 0)) {
    if (list.length == 1)
        return list[0];
    let result = Buffer.alloc(total);
    let pos = 0;
    for (let bf of list) {
        for (let b of bf) {
            if (pos < total)
                result[pos++] = b;
            else
                return result;
        }
    }
    return result;
}
Buffer.myConcat = function(list,totalLength=list.reduce((len,item)=>len+item.length,0)){
  if(list.length==0)
    return list[0];
  let newBuffer = Buffer.alloc(totalLength);
  let offset = 0;
  for(let i=0;i<list.length;i++){
    if(offset+list[i].length>totalLength){
      list[i].copy(newBuffer,offset,0,totalLength-offset);
      break;
    }else{
      list[i].copy(newBuffer,offset,0,list[i].length);
      offset+=list[i].length;
    }
  }
  return newBuffer;
}

4.7 isBuffer

判断是否是buffer

Buffer.isBuffer

4.8 length

获取字节长度(显示是字符串所代表buffer的长度)

Buffer.byteLength("沐枫");
buffer.length;

6. base64

上一篇 下一篇

猜你喜欢

热点阅读