欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

node.js中Buffer缓冲器的原理与使用方法分析

程序员文章站 2022-04-06 13:25:08
本文实例讲述了node.js中buffer缓冲器的原理与使用方法。分享给大家供大家参考,具体如下: 一、什么是buffer buffer缓冲器是用来存储输入和输出数据的一段内存。j...

本文实例讲述了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填充数据
let buf1 = buffer.alloc(6);
console.log(buf1);
//指定数字进行填充
let buf2 = buffer.alloc(6, 2);
console.log(buf2);
//也可以指定字符进行填充,第三个参数表示字符编码,默认为utf8
let buf3 = buffer.alloc(6, 'a', 'utf8');
console.log(buf3);

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

let buf = buffer.allocunsafe(6);
console.log(buf);

通过字节数组创建一个buffer

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

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

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

五、buffer的一些常用方法

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

let buf = 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中写入数据

let buf = 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位的整数,注意该整数是带符号的。

let buf = 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,将低位存储在起始位置。

let buf = buffer.alloc(6);
//将高位存储在起始位置
buf.writeint16be('256', 0); // [01 00 00 00 00 00]
console.log(buf);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readint16be(0));
let buf2 = buffer.alloc(6);
//将低位存储在起始位置
buf2.writeint16le('256', 0); // [00 01 00 00 00 00]
console.log(buf2);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readint16le(0));

通过 tostring() 方法,将buffer解码成字符串。

let buf = 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仍然是同一块内存。

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

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

let t_buf = buffer.alloc(12);
let s_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

let buf1 = buffer.alloc(6);
buf1.write('hello,');
let buf2 = buffer.alloc(6);
buf2.write('世界');
let buf3 = buffer.concat([buf1, buf2]);
console.log(buf3.tostring());
//如果合并后的buffer字节数大于设置的值,则会截断
let buf4 = 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程序设计有所帮助。