Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包括Buffer实例的创建、比较、连接、拷贝、查找、遍历、类型转换、截取、编码转换等。
创建
- new Buffer(array)
- Buffer.alloc(length)
- Buffer.allocUnsafe(length)
- Buffer.from(array)
通过 new Buffer(array)
// Creates a new Buffer containing the ASCII bytes of the string 'buffer'
const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
验证下:
var array = 'buffer'.split('').map(function(v){
return '0x' + v.charCodeAt(0).toString(16)
});
console.log( array.join() );
// 输出:0x62,0x75,0x66,0x66,0x65,0x72
通过 Buffer.alloc(length)
var buf1 = Buffer.alloc(10); // 长度为10的buffer,初始值为0x0
var buf2 = Buffer.alloc(10, 1); // 长度为10的buffer,初始值为0x1
var buf3 = Buffer.allocUnsafe(10); // 长度为10的buffer,初始值不确定
var buf4 = Buffer.from([1, 2, 3]) // 长度为3的buffer,初始值为 0x01, 0x02, 0x03
通过Buffer.from()
例子一:Buffer.from(array)
// [0x62, 0x75, 0x66, 0x66, 0x65, 0x72] 为字符串 "buffer"
// 0x62 为16进制,转成十进制就是 98,代表的就是字母 b
var buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
console.log(buf.toString());
例子二:Buffer.from(string[, encoding])
通过string创建buffer,跟将buffer转成字符串时,记得编码保持一致,不然会出现乱码,如下所示。
var buf = Buffer.from('this is a tést'); // 默认采用utf8
// 输出:this is a tést
console.log(buf.toString()); // 默认编码是utf8,所以正常打印
// 输出:this is a tC)st
console.log(buf.toString('ascii')); // 转成字符串时,编码不是utf8,所以乱码
对乱码的分析如下:
var letter = 'é';
var buff = Buffer.from(letter); // 默认编码是utf8,这里占据两个字节 <Buffer c3 a9>
var len = buff.length; // 2
var code = buff[0]; // 第一个字节为0xc3,即195:超出ascii的最大支持范围
var binary = code.toString(2); // 195的二进制:10101001
var finalBinary = binary.slice(1); // 将高位的1舍弃,变成:0101001
var finalCode = parseInt(finalBinary, 2); // 0101001 对应的十进制:67
var finalLetter = String.fromCharCode(finalCode); // 67对应的字符:C
// 同理 0xa9最终转成的ascii字符为)
// 所以,最终输出为 this is a tC)st
例子三:Buffer.from(buffer)
创建新的Buffer实例,并将buffer的数据拷贝到新的实例子中去。
var buff = Buffer.from('buffer');
var buff2 = Buffer.from(buff);
console.log(buff.toString()); // 输出:buffer
console.log(buff2.toString()); // 输出:buffer
buff2[0] = 0x61;
console.log(buff.toString()); // 输出:buffer
console.log(buff2.toString()); // 输出:auffer
buffer比较
buf.equals(otherBuffer)
判断两个buffer实例存储的数据是否相同,如果是,返回true,否则返回false。
// 例子一:编码一样,内容相同
var buf1 = Buffer.from('A');
var buf2 = Buffer.from('A');
console.log( buf1.equals(buf2) ); // true
// 例子二:编码一样,内容不同
var buf3 = Buffer.from('A');
var buf4 = Buffer.from('B');
console.log( buf3.equals(buf4) ); // false
// 例子三:编码不一样,内容相同
var buf5 = Buffer.from(&