一、概述
Buffer库为Node.js带来了一种存储原始数据的方法,可以让Nodejs处理二进制数据,每当需要在Nodejs中处理I/O操作中移动的数据时,就有可能使用Buffer库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。与其他模块不同的是,在应用时无需引用此模块,因为它是全局访问的,只需在使用时实例一下即可。在node环境下打印buffer可以看到buffer是一个对象,也是一个构造函数,具有自己的属性和静态方法。
二、Buffer有三种形式的构造函数:
① Buffer.alloc();;//创建一个buffer
②Buffer.from(array);//通过构造函数使用数组初始化缓存区
③Buffer.from(str,[encoding]);//通过构造函数使用字符串初始化缓存区
三、Buffer的类方法
1、 isBuffer()方法
isBuffer()方法可以判断一个对象是否为一个Buffer()对象。程序示例:
Buffer.isBuffer(obj);
2、byteLength()方法
使用byteLength()方法可以计算一个字符串的字节长度。
程序实例:
Buffer.byteLength(string,[encoding]);
参数说明:
①string:表示被测试的字符串
②encoding:表示字符串的编码格式,默认为UTF-8。
3、 concat()方法
使用concat()方法可以将几个Buffer对象结合为一个新的Buffer对象。程序实例:
Buffer.concat(list,[totalLength]);
参数说明:
①list:表示一个装有多个Buffer对象的数组。
②totalLength:表示被创建的Buffer对象的总长度。
4、isEncdoing()方法
isEncoding()方法用于检测一个字符串是否为一个有效的编码格式字符串,程序实例:
Buffer.isEncoding(string);//string表示被检测的字符串
5、compare(a,b)方法
Buffer的比较,常用于buffer实例数组的排序
6、Buffer.from(array)
通过一个八位字节的 array
创建一个新的 Buffer
。
7、Buffer.from(buffer)
将传入的 buffer
数据拷贝到一个新建的 Buffer
实例。
8、Buffer.from(string[, encoding])
新建一个包含所给的 JavaScript 字符串 string
的 Buffer
。 encoding
参数指定 string
的字符编码。
9、Buffer.from(arrayBuffer[, byteOffset[, length]])
arrayBuffer
:ArrayBuffer
或SharedArrayBuffer
或TypedArray
的.buffer
属性。byteOffset
: 开始拷贝的索引。默认为0
。length
: 拷贝的字节数。默认为arrayBuffer.length - byteOffset
。
该方法将创建一个 ArrayBuffer
的视图,而不会复制底层内存。例如,当传入一个 TypedArray
实例的 .buffer
属性的引用时,这个新建的 Buffer
会像 TypedArray
那样共享同一分配的内存。
四、buffer的应用
1、写入buffer:buf.write
var buf = Buffer.alloc(7);buf.write("12345678)
console.log(buf)//输出<Buffer 31 32 33 34 35 36 37>
2、读取buffer:buffer.toString()按照存入的编码进行读取。除了toString()函数,还可以用toJSON()直接将Buffer解析成JSON对象。
var buf =Buffer.from('hello 你好');
buf.write("hi 你好") //回车输出9
buf.toString()//输出“hi 你好好”,会补齐长度12
五、buffer代码应用(在node环境下输出以下代码实例)
1、Buffer.alloc 实例
Buffer.from("hello 李四");
//输出<Buffer 68 65 6c 6c 6f 20 e6 9d 8e e5 9b 9b>一串字符,默认是utf8编码格式,也可修改编码格式
2、指定编码格式“base64”
Buffer.from("hello 李四","base64");
//输出<Buffer 85 e9 65 a0>
3、buffer的长度
var buf =Buffer.alloc(8)
buf.length //8
4、输出指定内存大小的buffer,多余的部分会被舍弃
var buf =Buffer.alloc(7);buf.write("12345678)
console.log(buf)//输出<Buffer 31 32 33 34 35 36 37>
5、数组初始化,通过索引找buffer内数组的值
var buf = Buffer.from([1,2,3,4]);
console.log(buf,buf[0])//<Buffer 01 02 03 04> 1
//如果数组内的值是小数,会舍弃小数点后面的值直接输出整数
6、buf.write(string,offset =0,length,encoding='utf8')用法,offset :偏移量,从第几个开始
var buf = Buffer.from('hello 你好');buf.length //12
buf.write("hi 你好") //回车输出9
buf.toString()//输出“hi 你好好”,会补齐长度12
buf.write(' hellohellohello',2,13)
buf.toString()//输出'hi hellohell'
7、 buf.copy(target,tStart,sStart,sEnd = buffer.length)用法;target:要被复制的目标buffer,tStart:被复制的目标buffer中从第几个字节开始写,默认0;sStart:原buffer里面获取数据的时候的开始位置,默认为0;sEnd 用来指定从复制源对象里面获取数据的结束位置,默认是复制源的长度
var buf =Buffer.from("hello 12345")
buf.length //11
var buf2 =Buffer.alloc(5)
buf.copy(buf2)//5
buf2.toString()//hello
buf.copy(buf2,0,6,11)//5
buf2.toString()//12345
8、buffer.compare(otherBuffer);buffer与otherBuffer相同返回0,如果 otherBuffer排在 buf 前面,则返回 1 。如果 otherBuffer排在 buf 后面,则返回 -1
9、buffer.slice(start,end);被裁减的buffer的起始和终点位置
10、buffer.equals(otherBuffer);buffer与otherBuffer具有相同的字节数时返回true,否则false
11、buffer.fill(value,offset,end);value:填充的buf值,offset跳过的字节数,默认为0,end结束的长度
12、Buffer对象与JSON对象之间的转换:在Node.js中可以使用JSON.stringify()方法将Buffer对象中保存的数据转换成字符串。也可以使用JSON.parse()方法将一个经过转换之后的字符串变回一个数组。
var buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
var json = JSON.stringify(buf);
console.log(json);// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(JSON.parse(json));//输出{ type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }