node.js中Buffer缓冲器的原理是什么

本篇文章给大家分享的是有关node.js中Buffer缓冲器的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、什么是Buffer

node.js中Buffer缓冲器的原理是什么

Buffer缓冲器是用来存储输入和输出数据的一段内存。js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了。

所以node.js提供了Buffer类来处理二进制数据,Buffer类是一个全局变量,Buffer在创建的时候大小就固定了,无法改变。

Buffer类的实例类似于由字节元素组成的数组,可以有效的表示二进制数据。

二、什么是字节

字节是计算机存储时的一种计量单位,一个字节等于8个位。一个位就代表0或1,每8个位(bit)组成一个字节(byte)。

字节是网络传输数据的基本单位,一个字节最大表示的十进制数是255。

三、什么是进制

进制是人为定义的带进位的计数方法,常见的有二进制,八进制,十六进制,和十进制。

将任意数字转换成不同进制

console.log(parseInt('12',2));
console.log(parseInt('12',8));
console.log(parseInt('12',16));
console.log(parseInt('12',10));

转换进制的另一种方法:

console.log((10).toString(2));
console.log((10).toString(8));
console.log((10).toString(16));
console.log((10).toString(10));

四、创建Buffer的方法

通过Buffer.alloc来创建指定长度Buffer

//创建6个字节的Buffer,用0填充数据
letbuf1=Buffer.alloc(6);
console.log(buf1);
//指定数字进行填充
letbuf2=Buffer.alloc(6,2);
console.log(buf2);
//也可以指定字符进行填充,第三个参数表示字符编码,默认为utf8
letbuf3=Buffer.alloc(6,'a','utf8');
console.log(buf3);

通过Buffer.allocUnsafe创建未初始化的Buffer,Buffer中的数据是未知的。

letbuf=Buffer.allocUnsafe(6);
console.log(buf);

通过字节数组创建一个Buffer

letbuf=Buffer.from([1,2,3,4,5]);
console.log(buf);

通过字符串创建一个Buffer,第二个参数表示字符编码,一个中文用3个字节表示。

letbuf=Buffer.from('世界你好','utf8');
console.log(buf);

五、Buffer的一些常用方法

通过 fill() 以指定的数据填充Buffer

letbuf=Buffer.alloc(12);
console.log(buf);
//参数一表示用来填充的值
//参数二表示开始的偏移量
//参数三表示结束的偏移量
//参数四表示字符编码
//偏移量的计算是左闭右开的区间,[start,end)
buf.fill(1,0,2);
console.log(buf);
buf.fill(2,2,4);
console.log(buf);
buf.fill('A',4,6);
console.log(buf);

通过 write() 向Buffer中写入数据

letbuf=Buffer.alloc(12);
console.log(buf);
//参数一表示要写入的字符串
//参数二表示写入的偏移量
//参数三表示写入的字节数
//参数四表示字符编码
buf.write('世界',0,3);
console.log(buf);
console.log(buf.toString());
buf.write('世界',3,6);
console.log(buf);
console.log(buf.toString());

通过 writeInt8() 写入一个8位的整数,注意该整数是带符号的。

letbuf=Buffer.alloc(12);
console.log(buf);
buf.writeInt8(1,0);
buf.writeInt8(2,1);
buf.writeInt8(3,2);
//注意,8位的整数,如果带符号,区间在-128到127之间
buf.writeInt8(127,3);
console.log(buf);

方法中还有一些writeInt16BE(),writeInt32BE(),writeInt16LE(),writeInt32LE()的方法。

因为不同的CPU架构,有不同的字节序,字节序是指数字在内存中保存的顺序。

以 BE 结尾的,表示 Big Endian ,将高位存储在起始位置。

以 LE 结尾的,表示 Little Endian,将低位存储在起始位置。

letbuf=Buffer.alloc(6);
//将高位存储在起始位置
buf.writeInt16BE('256',0);//[010000000000]
console.log(buf);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readInt16BE(0));
letbuf2=Buffer.alloc(6);
//将低位存储在起始位置
buf2.writeInt16LE('256',0);//[000100000000]
console.log(buf2);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readInt16LE(0));

通过 toString() 方法,将Buffer解码成字符串。

letbuf=Buffer.alloc(12);
buf.write('世',0,3);
buf.write('界',3,3);
buf.write('你',6,3);
buf.write('好',9,3);
console.log(buf);
console.log(buf.toString());

通过 slice() 创建一个新的Buffer切片,但是内存的指向与原Buffer仍然是同一块内存。

letbuf=Buffer.alloc(12,6);
console.log(buf);
//参数一表示开始切片偏移量
//参数二表示结束切片偏移量
letbuf2=buf.slice(0,3);
buf2.fill(9);
console.log(buf);

通过 copy() 拷贝一个Buffer的数据到另一个Buffer

lett_buf=Buffer.alloc(12);
lets_buf=Buffer.alloc(6);
s_buf.write('世界',0);
console.log(s_buf.toString());
//参数一表示,拷贝进的Buffer
//参数二表示,拷贝进Buffer的开始偏移量
//参数三表示,源Buffer的开始拷贝偏移量
//参数四表示,源Buffer的结束拷贝偏移量
s_buf.copy(t_buf,0,0,6);
console.log(t_buf.toString());

通过 Buffer.concat() 可以合并多个Buffer,返回一个新Buffer

letbuf1=Buffer.alloc(6);
buf1.write('hello,');
letbuf2=Buffer.alloc(6);
buf2.write('世界');
letbuf3=Buffer.concat([buf1,buf2]);
console.log(buf3.toString());
//如果合并后的Buffer字节数大于设置的值,则会截断
letbuf4=Buffer.concat([buf1,buf2],9);
console.log(buf4.toString());

判断是否为一个Buffer

console.log(Buffer.isBuffer({'name':'test'}));
console.log(Buffer.isBuffer(Buffer.from('test')));

通过 Buffer.byteLength() 获取字符串字节长度

console.log(Buffer.byteLength('你好,世界'));

以上就是node.js中Buffer缓冲器的原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

发布于 2021-03-24 01:21:42
收藏
分享
海报
0 条评论
157
上一篇:使用Python怎么绘制一个中国地图 下一篇:如何在jquery中使用echarts实现可视化
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码