Buffer缓冲器
1.什么是Buffer
缓冲区Buffer是暂时存放输入输出数据的一段内存,JS语言没有二进制数据类型,而当处理TCP和文件流时我们必须要处理二进制数据,因此Node为我们提供了一个Buffer对象对二进制数据进行操作。
Buffer是一个标识固定内存分配的全局对象,也就是说要放到缓存区中的字节数需要提前确定好,它就好比由一个8位字节元素组成的数组,可以有效地在JS中表示二进制数据。
2.定义Buffer的三种方式
- 通过长度定义
//表示分配一个长度为6个字节的Buffer //且会把所有的字节设置为0 //可以提供默认值 let buf1 = Buffer.alloc(6); let buf2 = Buffer.alloc(6,2); console.log(buf1); // <Buffer 00 00 00 00 00 00> console.log(buf2); // <Buffer 02 02 02 02 02 02> //分配一块没有初始化的内存 let buf3 = Buffer.allocUnsafe(6); console.log(buf3); // 出现6字节的随机数据
- 通过字符串定义
let buf4 = Buffer.from('哈哈'); console.log(buf4); // <Buffer e5 93 88 e5 93 88>
- 通过数组定义
let buf5 = Buffer.from([1,2,3]); console.log(buf5); // <Buffer 01 02 03>
3.常用方法
1.buf.fill(value,offset,end,encoding)
@params
value:需要填充的内容
offset:开始写入之前要跳过的字节数
end:填充结束索引
encoding:表示编码方式
@return
填充后的Buffer数据
let buf6 = Buffer.alloc(6);
buf6.fill(3,1,3);
console.log(buf6); // [0,3,3,0]
2.buf.write(value,offset,length,encoding)
@params
value:需要写入的字符串
offset:开始写入之前要跳过的字节数
length:写入的字节长度
encoding:表示编码方式
@return
写入后的Buffer数据
let buf7 = Buffer.alloc(6);
buf7.write("哈哈",0,3,'utf8');
console.log(buf7); // <Buffer e5 93 88 00 00 00>
console.log(buf7.toString()); // 哈
3.buf.writeInt8(value,offset)
@params
value:需要写入的数值
offset:开始写入之前要跳过的字节数
@return
写入后的Buffer数据
let buf8 = Buffer.alloc(6);
// 向指定的索引写入一个8位的整数,也就是说占用一个字节的整数
buf8.writeInt8(0,0);
buf8.writeInt8(16,1);
buf8.writeInt8(32,2);
console.log(buf8); // <Buffer 00 10 20 00 00 00>
let buf9 = Buffer.alloc(6);
// Big Endian 高位在前
buf9.writeInt16BE(2**8,0);
console.log(buf9); // <Buffer 01 00 00 00 00 00>
console.log(buf9.readInt16BE(0)); // 256
// Little Endian 低位在前
buf9.writeInt16LE(2**8,2);
console.log(buf9); // <Buffer 01 00 00 01 00 00>
console.log(buf9.readInt16LE(2)); // 256
4.buf.slice(start,end)
@params
start:新Buffer开始的位置
end:新Buffer结束的位置
@return
新的Buffer数据,它引用与原始的 Buffer 相同的内存
let buf10 = Buffer.alloc(6,1);
let buf11 = buf10.slice(2,6);
console.log(buf11); // <Buffer 01 01 01 01>
buf11.fill(4);
console.log(buf10); // <Buffer 01 01 04 04 04 04>
// 解决乱码问题
let buf12 = Buffer.from('哈哈哈哈');
let buf13 = buf12.slice(0,5);
let buf14 = buf12.slice(5);
console.log(buf13.toString()); // 哈�
console.log(buf14.toString()); // �哈哈
let {StringDecoder} = require('string_decoder');
let sd = new StringDecoder();
// write的时候会判断是不是一个字符
// 如果是的话就输出,不是的话则缓存在对象内部,等下次write的时候会把前面缓存的字符加到第二次write的buffer上再进行判断
console.log(sd.write(buf13)); // 哈
console.log(sd.write(buf14)); // 哈哈哈
5.Buffer.isBuffer(obj)
@params
obj:需要判断的对象
@return
如果obj是一个Buffer,则返回 true,否则返回 false。
let obj1 = Buffer.alloc(6);
let obj2 = [1,2,3];
console.log(Buffer.isBuffer(obj1)); // true
console.log(Buffer.isBuffer(obj2)); // false
6.Buffer.byteLength(string, encoding)
@params
string:要计算长度的值
encoding:编码方式
@return
string中包含的字节数
console.log(Buffer.byteLength('哈哈','utf-8')); // 6