在js中有字符串数据类型,没有二进制数据类型。在处理TCP流或者是文件流时,必须使用二进制数据。所以在node.js中定义了一个Buffer类型,该类是用来存放二进制的文件的缓冲区。
在node.js中,Buffer类是随Node内核一起发布的核心库。Buffer库为Node.js提供了一种存储原始数据的方法,可以让Node.js处理二进制数据。
Buffer的字符编码
Buffer的实例一般用来表示编码字符的序列,比如UTF-8,Base64或者16进制的编码的数据。通过显示的字符编码,可以在Buffer实例与普通JavaSrcript字符串之间进行转换。
const buf = Buffer.from('learn node','ascii'); //6c6561726e206e6f6465 console.log(buf.toString('hex')); //bGVhcm4gbm9kZQ== console.log(buf.toString('base64')); //learn node console.log(buf.toString());
Node.js目前支持的编码如下
ascii 支持7位的ASCII数据。如果设置去掉高位,这种编码是非常快的。 utf8 多字节编码的Unicode字符。 utf16le 2或4个字节,小字节序编码Unicode字符。支持代理对(U+10000 至 U+10FFFF) ucs2 utf16le的别名 latin1 一种吧Buffer编码成一字节编码的字符串的方式 binary latin1的别名 hex 将每个字节编码为两个十六进制字符。
创建Buffer类
Buffer提供一下方法创建
Buffer.alloc(size[,fill[,encodding]]);返回一个指定大小的Buffer实例,如果没有设置 fill,则默认填满 0
Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
Buffer.allocUnsafeSlow(size)
Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
//创建一个长度为100的,且用0填充的buffer const buf1 = Buffer.alloc(100); //创建一个长度为100,且用1填充的buffer const buf2 = Buffer.alloc(100,1); //创建一个长度为100,且为初始化的Buffer, //这个方法比调用Buffer.alloc();更快, //但返回的Buffer实例可能包含旧数据。 //因此需要使用fill()或write()重写 const buf3 = Buffer.allocUnsafe(100); //创建一个包含1,2,3的Buffer const buf4 = Buffer.from([1,2,3]); //创建一个包含UTF-8字节[0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer const buf5 = Buffer.from('test'); //创建一个包含latin-1字节的[0x74, 0xc3, 0xa9, 0x73, 0x74] 的Buffer const buf6 = Buffer.from('test','latin-1');
写入缓冲区
语法
buf.write(string[,offset[,length]][,encoding])
参数说明
string - 写入缓冲区的字符串。
offset -缓冲区写入的初始值,默认值为0
length - 写入的字节数
encoding -使用的编码,默认为‘utf-8’
返回值
返回实际写入的大小,如果buffer的大小不够,则只会写入部分字符串。
const buf = Buffer.alloc(256); const len =buf.write("hello world"); console.log("写入的长度"+len);
输出的结果为
写入的长度为11
从缓存区读取数据
buf.toString([encoding[,start][,end]]);
参数说明:
encoding - 使用的编码,默认为‘utf-8’
start -指定开始读取的位置的索引。默认为0
end - 指定结束的位置,默认为缓冲区的末尾
返回值
缓冲区指定的解码的字符串
列子
const buf = Buffer.alloc(26); for(var i=0;i<26;i++){ buf[i]=i+97; } console.log(buf.toString('ascii'));//输出abcdefghijklmnopqrstuvwxyz console.log( buf.toString('ascii',0,5)); // 输出: abcde console.log( buf.toString('utf8',0,5)); // 输出: abcde console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde
Buffer转化为json对象
语法
buf.toJSON();
Buffer缓冲区合并
语法
Buffer.concat(list[,totallength]);
参数说明
list - 用于合并的Buffer对象数组列表
totalLength - 指定合并后Buffer对象的总长度
列子
let buf1 = Buffer.from("hello");
let buf2 = Buffer.from("world");
let buf3 = Buffer.concat([buf1,buf2]);
console.log(buf3);
Buffer缓冲区比较
Node Buffer 比较的函数语法如下所示, 该方法在 Node.js v0.12.2 版本引入:
语法
buf.compare(otherBuffer);
参数
buf - 缓冲区对象
otherBuffer - 与buf比较的另一个缓冲区对象
返回值
返回一个数字,表示buf在otherBuffer之前,之后或相同
小于0,之前相同
等于0,相同
大于0,之后相同
缓冲区拷贝
语法
buf.copy(targetBuffer[,targetStart[,sourceStart[,sourceEnd]]]);
参数:
targetBuffer
sourceStart
sourceEnd
返回值
无
缓冲区裁剪
语法
buf.slice([start[,end]]);
参数
start - 开始字符串,默认为0
end - 结束字符串, 默认为缓冲区的长度
返回值
返回一个新的缓冲区,他和旧的缓冲区指向同一块内存,从索引start 开始到end结束。
缓冲区长度
语法
buf.length;
返回值:
返回Buffer所占据的内存长度