node.js中Buffer缓冲器的原理与使用方法分析
本文实例讲述了node.js中Buffer缓冲器的原理与使用方法。分享给大家供大家参考,具体如下:
一、什么是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结尾的,表示BigEndian,将高位存储在起始位置。
以LE结尾的,表示LittleEndian,将低位存储在起始位置。
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程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。