node.js缓冲区(buffer)

在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所占据的内存长度