node.js的Buffer(缓冲区)之二
如何将Buffer转化为JSON对象
语法:
buf.toJSON()
当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。
返回值:JSON对象
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
//把buf转化为JSON字符串
const jsonStr = JSON.stringify(buf);//该语句会隐式调用toJSON()方法
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(jsonStr);
//JSON字符串不能用.来调用他的属性
console.log(jsonStr.data);
//把buf转化为JSON对象
let json = buf.toJSON();
console.log(json);
//JSON对象可以用.来调用他的属性
console.log(json.data);
//把JSON字符串变回Buffer对象
const copy = JSON.parse(jsonStr, (key, value) => {
return value && value.type === 'Buffer' ?
Buffer.from(value.data) :
value;
});
// 输出: <Buffer 01 02 03 04 05>
console.log(copy);
执行结果如下:
切记,第一条跟第二条是两个东西,第一个是JSON字符串是字符串,第二个是JSON对象。
Buffer的合并(concat)和比较(compare)
合并语法:
Buffer.concat(list[, totalLength])
参数描述:
- list - 用于合并的 Buffer 对象数组列表。
- totalLength - 指定合并后Buffer对象的总长度。
返回值:返回一个多个成员合并的新 Buffer 对象。
let buffer1 = Buffer.from(('快到碗里来!'));
let buffer2 = Buffer.from(('你才到碗里去!'));
let buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());
执行结果:
比较语法:
buf.compare(otherBuffer);
参数描述:
- otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。
返回值:返回一个数字,表示 buf 大于 otherBuffer ,小于otherBuffer或者等于otherBuffer。(大于是什么概念呢,其实就是跟C语言的ASCII码值的比较一样,从两个对象的第零个位置开始比较,直到某一位的ASCII码的值大于或者小于另一个对象那一位的ASCII码的值,那么就说这个对象大于或小于另一个对象,否则这两个对象相等)
let buffer1 = Buffer.from('1234');
let buffer2 = Buffer.from('1324');
let result = buffer1.compare(buffer2);
if(result < 0) {
console.log(buffer1 + " 大于 " + buffer2);
}else if(result == 0){
console.log(buffer1 + " 等于 " + buffer2);
}else {
console.log(buffer1 + " 小于 " + buffer2);
}
执行结果:
Buffer的拷贝(copy)和裁剪(slice)
拷贝语法:
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
参数描述:
- targetBuffer - 要拷贝的 Buffer 对象。
- targetStart - 数字, 可选, 默认: 0
- sourceStart - 数字, 可选, 默认: 0
- sourceEnd - 数字, 可选, 默认: buffer.length
返回值:没有返回值
let buf1 = Buffer.from('abcdefghijkl');
let buf2 = Buffer.from('0123456');
//将 buf2的第3到(5-1)位 从 buf1 的第2位开始插入
buf2.copy(buf1, 2,3,5);
console.log(buf1.toString());
执行结果如下:
裁剪语法:
buf.slice([start[, end]])
参数描述:
- start - 数字, 可选, 默认: 0
- end - 数字, 可选, 默认: buffer.length
返回值:返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。
let buffer1 = Buffer.from('123456');
console.log('buffer1:',buffer1);
// 剪切缓冲区
let buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());
buffer2.write('hi','utf8');
console.log('修改buffer2的内容后buffer1和buffer2的显示如下');
console.log('buffer1:', buffer1);
console.log('buffer2:',buffer2);
显示如下: