Buffer缓冲器(1)

        ES6之前,JS并没有处理二进制数据流的机制,Buffer作为NodeJS的API,可以在文件系统操作等场景处理二进制数据流: 

    0.Buffer类的实例类似于整数数组

    1.Buffer 的大小在被创建时确定,且无法调整;

    2.Buffer 类在 Node.js 中是一个全局变量,因此无需使用 require('buffer').Buffer

1.Buffer.alloc(size,[fill],[encoding])

    1.创建一个大小为size大小的新建Buffer,如果fill为undefined,则默认用0填充(自动调用 buf.fill(fill, encoding),或者 

buf.fill(fill)方法)

    2.size:创建Buffer的长度

    3.fill:用来填充Buffer的值

    4.encoding:编码格式。如果fill是字符串,则改该值是它的字符编码。默认utf-8

const b1=Buffer.alloc(5);
console.log(b1)//<Buffer 00 00 00 00 00>

2.Buffer.allocUnsafe(size)

    创建Buffer一个比较快的方法是Buffer.allocUnsafe(size),但会包含敏感数据(Buffer.alloc不会,因为已经是初始化的)

const b2=Buffer.allocUnsafe(5);
console.log(b2)//<Buffer c0 5d 35 00 00> 未初始化的,c0 5d不知道从哪里来的,猜测是文档中的敏感数据或者是旧数据

    解决敏敢数据问题,手动调用 buf.fill(fill, encoding)或者 buf.fill(fill)方法

const b2=Buffer.allocUnsafe(5);
console.log(b2)//<Buffer c0 5d 35 00 00> 
buf.fill(fill, encoding)或者 buf.fill(fill)方法
b2.fill(0);//全部用0填充
console.log(b2)//<Buffer 00 00 00 00 00>

3.Buffer.byteLength(string[, encoding])

    返回字符串的字节长度,字符串参数默认编码为utf8。注意字节长度不同于字符串长度

var leng=Buffer.byteLength('李','utf8');
var leng2=Buffer.byteLength('a','ascii');
var leng3=Buffer.byteLength('a','hex');
var leng4='李'.length;
console.log(leng)//3
console.log(leng2)//1
console.log(leng3)//0
console.log(leng4)//1

4.Buffer.compare(buf1, buf2)

    比较 buf1 和 buf2 ,通常用于 Buffer 实例数组的排序

const buf1 = Buffer.from('1234','utf8');//新建一个包含所给的 JavaScript 字符串 string 的 Buffer 。 encoding 参数指定 string 的字符编码。默认utf-8
const buf2 = Buffer.from('0123','utf8');
const arr = [buf1, buf2];
console.log(arr)//[ <Buffer 31 32 33 34>, <Buffer 30 31 32 33> ]
console.log('compare',arr.sort(Buffer.compare(buf1,buf2)))//compare [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
console.log(Buffer.compare(buf1,buf2))//1	

5.Buffer.concat(list[, totalLength])

    参数意义:

            1.list:Buffer数组

            2.totalLength:和并结束后,Buffer实例的总长度(如果没有提供 totalLength ,则从 list 中的 Buffer 实例计算得到)

           3.如果没有提供 totalLength ,则从 list 中的 Buffer 实例计算得到。 为了计算 totalLength 会导致需要执行额外的循环,所以提供明确的长度会运行更快。

            4. 如果从 list 中计算得到的 Buffer 长度超过了 totalLength,则合并的结果将会被截断为 totalLength 的长度。

var buf3=Buffer.alloc(5);
var buf4=Buffer.alloc(4);
var buf5=Buffer.alloc(3);
var totalLength=buf3.length+buf4.length+buf5.length;
var newBuf=Buffer.concat([buf3,buf4,buf5],totalLength);
console.log(newBuf)//<Buffer 00 00 00 00 00 00 00 00 00 00 00 00>
var newBuf1=Buffer.concat([buf3,buf4,buf5],totalLength-2);
console.log(newBuf1)//<Buffer 00 00 00 00 00 00 00 00 00 00>

    ***测试第三条,那种运算更快     

console.time('noLength')
var newBuf3=Buffer.concat([Buffer.alloc(5),Buffer.alloc(5),Buffer.alloc(5)]);
console.timeEnd('noLength')//noLength: 0.466ms
//为了尽可能去除影响,第二个文件下运行下面代码
console.time('Length')
var newBuf2=Buffer.concat([Buffer.alloc(5),Buffer.alloc(5),Buffer.alloc(5)],15);
console.timeEnd('Length')//Length: 0.354ms
    ***有了Length属性的更快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值