来源:处理类似TCP流或文件流(I/O)时,要用到二进制数据。因此,node定义了一个Buffer类,这个类用来创建一个专门存放二进制数据的缓冲区
一个Buffer类似于一个整数数组,但它对应V8堆内存之外的一块原始内存
由于Buffer对内存权限大,有点危险,因此在v6.0以后。官方建议使用Buffer.from()接口去创建Buffer对象
const buf = Buffer.from('A','ascil');//用ascil编码来存,第二个参数是编码方式。不填吗,默认utf-8。Buffer.from返回一个新的Buffer实例
console.log(buf.toString('hex')); //以十六进制去输出buf,结果72756e6f6f62
//toString里面可以传参数,以什么字符编码进行输出
const buf1 = Buffer.alloc(10); //长度十,0填充
const buf2 = Buffer.alloc(10,1); //长度十,十六进制0x1填充
const buf3 = Buffer.allocUnsafe(10); //长度十,未初始化,性能比Buffer.alloc()更快。但是因为可能包含以前的旧数据的关系,因此可以使用fill()或者write()重写
const buf4 = Buffer.from([1,2,3]) //一个包含[0x1,0x2,0x3]的Buffer
const buf5 = Buffer.from('test'); //里面用了一些十六进制去存储字符串,第二个参数不填默认是utf-8编码
buf.write(string,offset,length,encoding)
string:写入缓冲区字符串
offset:缓冲区开始写入索引值,默认0
length:写入字节数,默认buffer.length
encoding:编码方式,默认utf-8
当空间不足时,只会写入部分,返回buf.write返回实际写入大小值
buf.toString(encoding,start,end)
start:默认0
end:默认缓冲区末尾
buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
buf[i] = i + 97;
}
console.log( buf.toString('ascii')); // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5)); // 输出: abcde
console.log( buf.toString('utf8',0,5)); // 输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde
buf.toJSON() //字符串化Buffer实例时,JSON.stringify()隐式调用toJSON(),返回值为JSON对象
const buf = Buffer.from([0x1,0x2,0x3,0x4,0x5]);
const json = JSON.stringify(buf);
console.log(json); //{"type":"Buffer","data":"[1,2,3,4,5]"}
const cpy = JSON.parse(json,(key,value)=>{
return value && value.type === 'Buffer'?Buffer.from(value.data):value;
})
console.log(copy);
// 输出:
Buffer.concat(list,totalLengh)
//list:用于合并的Buffer对象数组列表
//totalLengh:指定合并后Buffer对象的总长度
//返回一个多个成员合并的Buffer对象
var buffer1 = Buffer.from(('A'));
var buffer2 = Buffer.from(('B'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log(buffer3); //AB
buf.compare(otherBuffer); //返回一个数字,具体判断看下面的例子
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);
if(result < 0){
console.log(buffer1 + '在' + buffer + '之前')
}
else if(result == 0){
console.log(buffer1 + '与' + buffer + '相同')
}
else{
console.log(buffer1 + '在' + buffer + '之后')
}
//结果ABC在ABCD之前
buf.copy(targetBuffer,targetStart,sourceStart,sourceEnd)
//一些参数不填是有默认值的,比如第二第三个默认是0,第四个默认是buffer.length
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
buf2.copy(buf1,2);
console.log(buf1.toString());
//abRUNOOBijkl ,只是覆盖了,多出来的并没有怎么样
var buffer1 = Buffer.from('runoob');
var buffer2 = buffer.slice(0,2); //不包括2
console.log(buffer2); //ru
var buffer = Buffer.from('lam');
console.log(buffer.length);
//3
//基本就是英文字母的长度