Buffer:缓冲区,指一块专门暂存数据的内存区域(在V8引擎的堆内存之外),其中存储着一定数量的字节或者字符数据。与String类型相对的,Buffer对象特别适合用于存储二进制数据。
Buffer类型的实例类似于一个从 0 到 255 之间的整数数组,其每个元素是一个字节的十六进制整数;一旦创建,就无法重新改变大小。与String不同的是,Buffer中的任意部分内容都是可以修改的。
Buffer class是全局对象global的成员,故使用该模块无需使用require('buffer')进行引入。
创建Buffer实例
Buffer对象的实例,可以通过读取文件获得,也可以直接构造:
// 创建一个长度为 10、且用零填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
//创建一个长度为三字节的缓冲区,内容为0x01,0x0a,0xff
const buf4=Buffer.from([1,10,255]);
//创建一个长度为4字节的缓冲区,内容为0x61,0x62,0x41,0x42
const buf5=Buffer.from('abAB');
//创建一个长度为6字节的缓冲区,内容为0xe4,0xb8,0xe4,0xba,0x8c
const buf6=Buffer.from('一二','utf8');
在 6.0.0 之前的 Node.js 版本中, Buffer 实例是使用 Buffer 构造函数创建的,为了使 Buffer 实例的创建更可靠且更不容易出错,各种形式的 new Buffer() 构造函数都已被弃用,且改为单独的 Buffer.from(),Buffer.alloc() 和 Buffer.allocUnsafe() 方法。
方法名 | 说明 |
---|---|
Buffer.alloc (size[,fill]) | 返回一个指定大小的新建的的已初始化的 Buffer。size必须是一个数字,第二个参数可以指定用来填充的Buffer数据。 |
Buffer.allocUnsafe(size )/Buffer.allocUnsafeSlow(size) | 返回一个指定大小的新建的未初始化的 Buffer。如果 size 小于或等于 Buffer.poolSize 的一半,则 Buffer.allocUnsafe() 返回的 Buffer 实例可能是从共享的内部内存池中分配。 Buffer.allocUnsafeSlow() 返回的实例则从不使用共享的内部内存池。 |
Buffer.from(string[, encoding]) | 返回一个新的 Buffer,其中包含提供的字符串的副本。可以指定编码格式 |
Node.js 当前支持的字符编码有:
ascii | 仅适用于 7 位 ASCII 数据。此编码速度很快,如果设置则会剥离高位。 |
---|---|
utf8 |
多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8。 |
utf16le |
2 或 4 个字节,小端序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。 |
ucs2 |
utf16le 的别名。 |
base64 |
Base64 编码。当从字符串创建 Buffer 时,此编码也会正确地接受 RFC 4648 第 5 节中指定的 “URL 和文件名安全字母”。 |
latin1 |
一种将 Buffer 编码成单字节编码字符串的方法(由 RFC 1345 中的 IANA 定义,第 63 页,作为 Latin-1 的补充块和 C0/C1 控制码)。 |
binary | latin1 的别名。 |
hex | 将每个字节编码成两个十六进制的字符。 |
Buffer和String间的转换
buf.write(str,offset) | str字符串,offset相当于在buffer中的偏移量 |
---|
将String转为Buffer对象:
var s1='AA';
var s2='BB';
var s3='CC';
var buf1=Buffer.alloc(6);
buf1.write(s1);
buf1.write(s2,2);
buf1.write(s3,4);
console.log(buf1);
console.log(buf1.toString());
//<Buffer 41 41 42 42 43 43>
//AABBCC
将Buffer内容转换为特定编码的String:
console.log(buf.toString()); //默认采用UTF-8编码
console.log(buf.toString('binary'));
console.log(buf.toString('hex'));
console.log(buf.toString('ascii'));
console.log(buf.toString('utf8'));
console.log(buf.toString('utf16le'));
console.log(buf.toString('base64'));
遍历Buffer
可以使用for循环配合buf.length和buf[index]来遍历缓冲区中的每个数据,也可以使用ES6新特性中的for...of循环遍历每个数据值。
//创建一个长度为8字节的缓冲区
const buf=Buffer.from('ab一二');
//使用for循环遍历缓冲区
for(var i=0;i<buf.length;i++){
console.log('%d-%s',buf[i],buf[i].toString(16))
}
//使用for...of遍历缓冲区
for(var v of buf){
console.log('%d-%s',v,v.toString(16))
}
Buffer常用操作
成员名 | 说明 |
---|---|
buf.compare( ) | 比较两个缓冲区的大小 |
buf.copy( ) | 拷贝缓冲区的(部分)内容 |
buf.equals( ) | 判断两个缓冲区的内容是否完全相同 |
buf.fill( ) | 使用指定的值填充缓冲区 |
buf.indexOf( ) | 指定值在缓冲区的开始下标 |
buf.includes( ) | 判断是否包含指定的值 |
buf.slice( ) | 返回一个缓冲区的部分值(不会返回新的缓冲区,而是返回了原始缓冲区的子集,修改返回值,原始缓冲区的值也会改变) |
buf.toJSON( ) | 转换为JOSN字符串格式 |
buf.write( ) | 向缓冲区指定位置写出指定值 |
将两个缓冲区内容拷贝到同一个缓冲区中:
const buf1=Buffer.from('ABC');
const buf2=Buffer.from('一二三');
var buf3=Buffer.alloc(buf1.length+buf2.length);//创建一个指定长度的缓冲区
buf1.copy(buf3);//将buf1缓冲区数据拷贝到buf3中,默认偏移量从0开始
buf2.copy(buf3,buf1.length);//将buf2缓冲区数据拷贝到buf3,偏移量是在buf1的末尾
console.log(buf3.toString());
//ABC一二三
buf.slice方法不会返回新的缓冲区,而是返回了原始缓冲区的子集,修改返回值,原始缓冲区的值也会改变:
const buf1=Buffer.from('ABC');
console.log(buf1);
var sub=buf1.slice(2);
console.log(sub);
sub[0]=0x44;
console.log(sub);
console.log(buf1)
//<Buffer 41 42 43>
//<Buffer 43>
//<Buffer 44>
//<Buffer 41 42 44>