Node中Buffer学习笔记

JS语言没有二进制数据类型,而在处理TCP和文件流的时候,必须要处理二进制数据。NodeJS提供了一个Buffer对象来提供对二进制数据的操作,比如文件流的读写、网络请求数据的处理等。

Buffer是一个全局类,无需加载就可使用。Buffer 存的都是16进制的。

定义buffer的三种方式

1.通过长度创建

  • alloc安全,速度会慢* allocUnsafe速度快,但是不安全```
    // 创建一个长度为 10、且用 0 填充的 Buffer。
    const buf1 = Buffer.alloc(10);
    // 创建一个长度为 10、且用 0x1 填充的 Buffer。
    const buf2 = Buffer.alloc(10, 1);
    // 创建一个长度为 10、且未初始化的 Buffer。
    const buf3 = Buffer.allocUnsafe(10);

### 2.通过数组创建

一般都要合法传递 0-255之间

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


### 3.通过字符串创建

const buf5 = Buffer.from(‘字符串’);


buffer常用方法
----------

### buffer.fill

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

* buffer.fill(value[,offset\[,end\]](about:blank# "#"))```
buffer.fill(0);

buffer.toString

  • bufffer.toString([encoding[, start[, end]]])```
    buffer.toString(‘utf8’,3,6)

### buffer.write

* buffer.write(string[, offset\[, length\]](about:blank# "#")) 参数:内容 偏移量 长度 编码```
buffer.write('前',0,3,'utf8');
buffer.write('端',3,3,'utf8'); //前端

buffer.slice

  • buf.slice([start[, end]]) slice是浅拷贝```
    let newBuf = buffer.slice(0,4);

// Buffer 和二维数组是一样的,Buffer存的都是内存地址,请看实例

let buffer = Buffer.alloc(6, 1)
let newBuffer = buffer.slice(0, 3)
newBuffer[0] = 100
console.log(buffer)


### buffer.copy

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

* bufffer.copy(target\[, targetStart\[, sourceStart\[, sourceEnd\]\]\])参数:目标buffer 引用buffer 起始为止 结束为止 复制位数```
let buf5 = Buffer.from('前端开发');
let buf6 = Buffer.alloc(6);
buf5.copy(buf6,0,0,4);
buf5.copy(buf6,3,3,6);
// buf6=前端

手写一个copy方法

// 目标buffer 目标开始的拷贝位置 源的开始 源的结束位置
Buffer.prototype.myCopy=function(target,targetStart,sourceStart,souceEnd){for(var i=0;i<sourceEnd-sourceStart;i++){target[i+targetStart]=this[sourceStart+i];}
}
buffer2.myCopy(buffer1,1,3,6);
console.log(buffer1.toString())

buffer.concat

  • Buffer.concat(list[, totalLength])```
    let buf1 = Buffer.from(‘前’);
    let buf2 = Buffer.from(‘端’);
    let buf3 = Buffer.concat([buf1,buf2],6);
    console.log(buf3.toString());

> 手写一个concat方法

Buffer.myConcat = function (list,len) {if(typeof len === ‘undefined’){ // 求拷贝后的长度len = list.reduce((current,next,index)=>{return current+next.length;},0);}let newBuffer = Buffer.alloc(len); // 申请bufferlet index = 0;list.forEach(buffer =>{ // 将buffer一一拷贝buffer.copy(newBuffer, index);index+=buffer.length;});return newBuffer.slice(0,index); // 返回拷贝后的buffer
}
// 接收请求时会采用concat方法进行拼接
console.log(Buffer.myConcat([buffer1, buffer2, buffer3],10).toString());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值