1.注意点
下面的代码是一个大标题一个文件,所以变量名存在重复,单纯的看不影响,如果想拷贝出去 请分开拷贝。
2.创建buffer对象
// 创建Buffer对象的3种方法
//1. Buffer.alloc(length,填充物,编码)
const buf1=Buffer.alloc(10,1);
console.log(buf1); // <Buffer 01 01 01 01 01 01 01 01 01 01>
// 2.Buffer.allocUnsafe(length)
// 效率高,但不安全 可能包含旧数据 需使用fill()或者write()重写
const buf2=Buffer.allocUnsafe(10);
buf2.fill(1);
console.log(buf2); // <Buffer 01 01 01 01 01 01 01 01 01 01>
// 3.Buffer.from()
// 接收四种类型的参数 array、string、arrayBuffer、buffer
// 第二个参数指定字符集:ascii utf8 utf16le base64 latin1(binary) hex
let arrayBuf=Buffer.from([1,2,3]);
console.log(arrayBuf); // <Buffer 01 02 03>
let game='王者荣耀';
let stringBuf=Buffer.from(game,'utf8');
console.log(stringBuf); // <Buffer e7 8e 8b e8 80 85 e8 8d a3 e8 80 80>
let copyBuf1=Buffer.from(arrayBuf);
console.log(copyBuf1); // <Buffer 01 02 03>
let copyBuf2=Buffer.from(buf1);
console.log(copyBuf2); // <Buffer 01 01 01 01 01 01 01 01 01 01>
3. buffer和字符串的转换
// 1.toString()方法可以将buffer转换成字符串
let game='王者荣耀';
let buffer=Buffer.from(game);
console.log(buffer); // <Buffer e7 8e 8b e8 80 85 e8 8d a3 e8 80 80>
console.log(buffer.toString()); //王者荣耀
// 2.StringDecoder 将buffer转成字符串
// 先导入这个类
let stringDecoder=require('string_decoder').StringDecoder;
// 实例化
let decoer=new stringDecoder('utf8');
// 转成字符串
console.log(decoer.write(buffer));
//3. write('替换物',start-开始替换的位置,length-替换几个字节,encoding-编码集)
// 什么参数都不写 默认从0位置开始写入 写入的长度和替换为的字节数保持一致
//注意点:替换物的字节长度需要和length保持一致
// 将字符串写入buffer
buffer.write('射手',0,6,'utf8');
console.log(buffer.toString());
4. buffer和字符串的转换
理解字节序-阮一峰 关于计算 可以看一下这个文章
let buffer=Buffer.from([1,2,3]);
console.log(buffer);
// 1.read+(?U)(Int/Float/Double)+位数(8/16/32)+?(BE/LE)
//带U无符号 不带U有符号
// BE:Big-endian 大端序
// LE:Little-endian 小端序
// 第一个参数为起始位置 第二个参数为超出时是否报错 默认是false,超出报错
console.log(buffer.readInt8(1));
//2.write+(Int/Float/Double)+位数(8/16/32)+(16或者32要加BE/LE)
//第一个参数为写入的数据 第二个是起始位置 第三个为超出报错的标志
buffer.writeUInt8(127,0);
console.log(buffer);
5. buffer和JSON的转换
let buffer=Buffer.from('王者荣耀');
//1.使用JSON.stringify将buffer转成字符串 类型是string
let game=JSON.stringify(buffer)
console.log(game); //{"type":"Buffer","data":[231,142,139,232,128,133,232,141,163,232,128,128]}
//2.再使用JSON.parse将字符串还原成对象
gameArray=JSON.parse(game);
console.log(gameArray); // 这是一个对象
/*
{
type: 'Buffer',
data: [
231, 142, 139, 232,
128, 133, 232, 141,
163, 232, 128, 128
]
} */
console.log(Buffer.from(gameArray).toString()); // 王者荣耀
6. 拷贝与填充
这个稍微有点绕 尝试几次就可以了
// 1.source.copy(target,targetStart,sourceStart,sourceEnd)
// source是被拷贝者 , target是拷贝者
let buffer1=Buffer.from('王者荣耀');
let buffer2=Buffer.alloc(12);
let buffer3=Buffer.from('全军出击');
// 这里是将buffer1中位置0~6的数据拷贝到buffer2的0~6的位置上
buffer1.copy(buffer2,0,0,6);
console.log(buffer1.toString()); // 王者荣耀
console.log(buffer2.toString()); // 王者
// 这里是将buffer1中位置6~结束的数据拷贝到buffer3的0开始的位置上 长度为buffer1中6~结束的长度
buffer1.copy(buffer3,0,6);
console.log(buffer3.toString()); // 荣耀出击
// 2.使用特定的数字填充buffer
let buffer4=Buffer.alloc(10);
buffer4.fill(10);
console.log(buffer4); //<Buffer 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a>
// 3.使用特定的字符串填充buffer
buffer4.write('a');
console.log(buffer4);
7. Buffer类方法
//1. Buffer.isBuffer方法 判断是否是buffer类型
let buffer=Buffer.from('王者荣耀');
console.log(Buffer.isBuffer(buffer)); // true
console.log(Buffer.isBuffer('OK')); // false
//2.Buffer.byteLength 返回buffer字节数
console.log(Buffer.byteLength(buffer)); // 12
//3.Buffer.concat(Buffer_list,totalLength)方法
//注意点:如第一个参数是空数组或totalLength为0,则返回空的buffer对象
let buffer2=Buffer.from("全军出击");
let buffer3=Buffer.concat([buffer,buffer2]);
console.log(buffer3.toString()); // 王者荣耀ADCarry
//4.isEncoding()方法:查看指定字符串是否是编码集 如utf8
console.log(Buffer.isEncoding('utf8')); // true
console.log(Buffer.isEncoding('utf16le')); //true
console.log(Buffer.isEncoding('Hello World')); //false