Buffer定义
Javascript比较擅长处理字符串,对于处理二进制数据(比如TCP数据流),就不太擅长。(在处理像TCP流或文件流时,必须使用到二进制数据),因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区,Buffer中存放的数据是0~255之间的整数值(即一个字节的数据)
通俗来讲:通常情况下,我们传输数据往往是为了处理它,或者读它,或者基于这些数据做处理等。但是,在每次传输过程中,有一个数据量的问题。因此当数据到达的时间比数据理出的时间快的时候,这个时候我们处理数据就需要等待了。
或者,如果处理数据的时间比到达的时间快,这一时刻仅仅到达了一小部分数据,那这小部分数据需要等待剩下的数据填满,然后再送过去统一处理。
这个”等待区域”就是buffer!
Buffer对象是Node处理二进制数据的一个接口。它是Node原生提供的全局对象,可以直接使用,不需要使用require(‘buffer’)引入buffer。
Buffer对象
Buffer对象又称为缓冲区对象,它有一个构造函数,由构造函数创建的对象,v8引擎会为其分配一块内存
创建buffer对象
(1)使用new运算符
//创建一个大小为8的空buffer
var bytes=new Buffer(8)
for(var i=0;i<bytes.length;i++){
bytes[i]=i
}
consoloe.log(bytes)
//<Buffer 00 01 02 03 04 05 06 07>
(2)使用from函数
const buf1=Buffer.from([1,2,3])
console.log(buf1)
//<Buffer 01 02 03>
(3)使用alloc函数
例如:创建一个长度为10的缓冲区,并且用0填充
const buf2=Buffer.alloc(10)
console.log(buf2)
//<Buffer 00 00 00 00 00 00 00 00 00 00>
缓存区的拷贝
接上例
var more=new Buffer(4)
bytes.copy(more,0,4,8)
console.log(more)
//<Buffer 04 05 06 07>
Buffer与字符编码
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。
const buf=Buffer.from('Hello World','ascii')
console.log(buf)
//<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
const buf2=Buffer.from('tést')
console.log(buf2)
//<Buffer 74 c3 a9 73 74>
console.log(buf2.toString('utf8',0,3))
//té
Buffer转换为JSON
JSON:JavaScript Object Notation对象,时前后端数据交换的常用格式,是以key-value的方式保存数据,由于体积小,创建方便,解析简单,所以被广泛应用。
只要应用程序需要将结构化信息作为文本进行交换或村相互,即可使用它。
const buf=Buffer.from([0x1,0x2,0x3,0x4,0x5])
var json=JSON.stringify(buf)
console.log(json)
//{"type":"Buffer","data":[1,2,3,4,5]}
缓冲区写入数据
语法:
buf.write(string[, offset[, length]][, encoding])
string
- 写入缓冲区的字符串。offset
- 缓冲区开始写入的索引值,默认为 0 。length
- 写入的字节数,默认为 buffer.lengthencoding
- 使用的编码。默认为 ‘utf8’ 。
例如:
var buf=Buffer.alloc(256)
let len=buf.write('Hello')
console.log(`写入字节数:${len}`)
//写入字节数:5
注意:如果 buffer 空间不足, 则只会写入部分字符串。
读取缓冲区数据
语法:
buf.toString([encoding[, start[, end]]])
例如:
var buf8=Buffer.alloc(256)
let len=buf8.write('\u00bd+\u00bc=\u00be',0); //write函数的返回值是写入的字节数 从第0个位置开始写
console.log(`${len}个字符:${buf8.toString('utf8',0,len)}`);
//8个字符:½+¼=¾