1、buffer的介绍
在引入 TypedArray 之前,JavaScript 语言没有用于读取或操作二进制数据流的机制。 Buffer 类是作为 Node.js API 的一部分引入的,用于在 TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。
现在可以使用 TypedArray, Buffer 类以更优化和更适合 Node.js 的方式实现了 Uint8Array API。
Buffer 类的实例类似于从 0 到 255 之间的整数数组(其他整数会通过 & 255 操作强制转换到此范围),但对应于 V8 堆外部的固定大小的原始内存分配。 Buffer 的大小在创建时确定,且无法更改。
Buffer 类在全局作用域中,因此无需使用 require('buffer').Buffer。
2、buffer中常用的方法
(1)length toString Buffer.isBuffer slice
(2) concat indexOf split
/**
* 1、存储二进制文件 0 1 最大每个位中不能超过1
* 2、一个字节几个位 8个bit位组成
* 3、汉字 几个字节组成 gbk 2个字节 node默认不支持gbk编码
* 4、utf8 一个汉字 2个字节
* 5、一个汉字 3个字节 24个位 buffer 将2进制转化成16进制 只是短而已。
* 6、buffer中存储的是16进制 内存 存在声明的时候 需要制定长度 单位中数字 都是字节单位
* 数字、字符串、数组
*/
let buffer=Buffer.alloc(10);
console.log(buffer)
let buffer1=Buffer.from('message'); //node utf8 toString()
console.log(buffer1);
let buffer2=Buffer.from([0xe7,0x88,0xb1]);
console.log(buffer2);
console.log(buffer2.toString('utf8')); // 可以和字符串任意转化
//读取文件 可能要操作内存 http
// 进制转换的base64位 加密算法 汉字举例 3*8=>4*6
let buf=Buffer.from('爱')
console.log(buf);
console.log(0xe7.toString(2));
console.log(0x88.toString(2));
console.log(0xb1.toString(2));
// 00111001 00111000 00100010 00110001 一般转化成base64 后比原内容 大1/3 最大2*6-1=63 0-63 ==64位置
// 小图标 icon 可以替换所有的url 不需要发送http请求
// base64的编码是公开的。
let str='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str+=str.toLocaleLowerCase();
str+='0123456789+/';
console.log(str[57]+str[56]+str[62]+str[32]); //cookie
//通过编码可以解决很多问题。
// buffer的声明方式 3种 长度 数字 数组 buffer不能增大
// 数组 索引 循环 slice
// Buffer 类在全局作用域中,因此无需使用 require('buffer').Buffer。
let buffer3=Buffer.from([11,12,13]);
let newBuffer=buffer3.slice(0,3);
newBuffer[0]=100;
console.log(buffer3);
console.log(Buffer.isBuffer(buffer3));
// toString 可以将buffer转化成字符串
// length 可以获取字节的个数
// Buffer.isBuffer
// copy contact
Buffer.prototype.copy=function(target,targetStart,sourceStart=0,sourceEnd=this.length){
for(let i=sourceStart;i<sourceEnd;i++){
target[targetStart+i]=this[i];
}
}
let buf11=Buffer.from('学');
let buf12=Buffer.from('习');
let buf13=Buffer.alloc(6);
buf11.copy(buf13,0,0,3);
buf12.copy(buf13,3);
console.log(buf13,toString());
// copy, contact 用的很多
console.log(Buffer.concat([buf11,buf12]).toString());
// reduce求和
Buffer.concat=function(bufferList,bufferLength=bufferList.reduce((a,b)=>a+b.length,0)){
let buffer=Buffer.alloc(bufferLength);
let offset=0;
BufferList.forEach(item=>{
item.copy(buffer,offset);
offset+=item.length;
})
return buffer;
}
// length toString Buffer.isBuffer slice concat
let bufferLove=Buffer.form('我爱你我爱你');
console.log(bufferLove.indexOf('我',6));
bufferLove.split('爱'); //实现buffer的分隔
// 编码 ASCII 美国 字母 符号都占用1个字节
// gb2312 两个字节连起来,算一个中文 第一个字节如果超过127 下一个字节,组成一个汉字
// gb18030 127*255 =36400
// unicode 编码
// utf8 基于unicode编码 实现可编码
Buffer.prototype.split=function(sep){
let len=buffer.from(sep).length;
let offset=0;
let arr[];
while(-1!=(current=this.indexOf(sep,offset))){
arr.push(this.slice(offset,current));
offset=current+len;
}
arr.push(this.slice(offset));
return arr;
}
// length toString Buffer.isBuffer slice
// concat indexOf split