一、Buffer的意思
中文译为缓冲区,是一个类似于Array的对象,用于表示固定长度的字节序列
简言而之,Buffer就是一段固定长度的内存空间,用于处理二进制数据
二、Buffer特点
1.大小固定无法调整
2.性能较好可直接对计算机内存进行操作
3.每个元素大小为1字节
三、Buffer的应用
(1)创建缓冲区
1》alloc
每一个二进制位都会归0
// 创建缓冲区
let buf1=Buffer.alloc(10);
console.log(buf1);
//<Buffer 00 00 00 00 00 00 00 00 00 00>
2》allocUnsafe
不安全,用allocUnsafe创建的Buffer可能会包含旧的内存数据。但是allocUnsafe的速度比alloc要快
let buf2=Buffer.allocUnsafe(10);
console.log(buf2);
//<Buffer 00 00 00 00 00 00 00 00 00 00>
(2)写数据到缓冲区
1》write
const buf1=Buffer.alloc(20);
var buf2=Buffer.from('Hello world');
buf1.write('天天向上');
console.log(bf1.toString()); //天天向上
// 将数据写入流方法 .write('写入数据的内容','写入数据的开始位置','写入数据的长度')
// 注意:“好好学习”有4个字符,每个字符在UTF-8编码中通常占用1到3个字节,所以会出现�这种乱码的情况
buf1.write('好好学习',10,10)
console.log(bf1.toString()); //天天向�好好学
(3)读取缓冲区
buf1.write('天天向上');
console.log(buf1.toString('utf8')); //天天向�好好学
console.log(buf1.toString('utf8',10,13)); //好
buf.toString([encoding[, start[, end]]])
encoding:使用的编码,默认为 'utf8';
start:指定开始读取的索引位置,默认为 0;
end :结束位置,默认为缓冲区的末尾。
(4)缓冲区间的拼接
buf1.write('好好学习');
buf2.write('天天向上');
var buf3=Buffer.concat([buf1,buf2]);
console.log(buf3.toString()); //天天向�好好学Hello world
四、Buffer的操作
(1)Buffer与字符串的转化
1》将一个字符串或者数组转为Buffer
Buffer.from()方法
let buf3=Buffer.from('love');
let buf4=Buffer.from([102,56,98]);
console.log(buf3);
//<Buffer 6c 6f 76 65>
console.log(buf4);
//<Buffer 66 38 62>
2》将Buffer转为一个字符串或者数组
toString()方法
//将Buffer转为字符串
let buf4=Buffer.from([105,108,111,118,101,121,111,117]);
console.log(buf4.toString());
//iloveyou
(2)Buffer里面对于单个元素的查看 []
获取第一个元素h里面所保存的数据,注意是十进制的表示形式
let buf=Buffer.from('hello');
console.log(buf[0]); //104
// 获取二进制的表示形式,可在后面加一个toString(2)
console.log(buf[0].toString(2)); //01101000
(3)Buffer里面对于单个元素的修改
console.log(buf); //<Buffer 68 65 6c 6c 6f>
buf[0]=95;
console.log(buf); //<Buffer 5f 65 6c 6c 6f>
(4)Buffer的溢出与中文 (了解即可)
1》溢出 (舍弃高位的数字)
以let buf=Buffer.from('hello');为例
//buffer二进制位所能存储的最大数字是255
buf[0]=361; //舍弃高位的数字 所以正常的是0001 0110 1001 变成了 0110 1001
console.log(buf); //<Buffer 69 65 6c 6c 6f>
2》中文
let buf2=Buffer.from('你好');
console.log(buf2); //<Buffer e4 bd a0 e5 a5 bd>
//此时结果是6个字节而非两个字节,因为这两个中文是utf-8的中文,一个utf-8的中文一般占3个字节