Buffers - 使用二进制数据
node中的Buffer是应高效率处理字符串而生的。他的性能部分用C++实现,其他部分用javascript实现。下面是他的两个主要优势:
1、Buffer所占用的内存不是V8所分配,属于堆外内存。
2、Buffer无所谓编码方式,换句话说它的length是固定的、准确的。他的长度就是字节长度。
new Buffer(size) new Buffer(str, encoding='utf8') new Buffer(array) | buffer的创建有三种方法:1、指定长度;2、从字符串转换,3、从字节数组转换 |
buffer.write(string, offset=0, encoding='utf8') | 把一个字符串转换成一个buffer,offset:字符串开始读取的位置;encoding:指定字符串的编码方式 |
buffer.isBuffer(obj) | 检查某对象class是否Buffer |
buffer.byteLength(string, encoding='utf8') | 获取某字符串的字节长度。 |
buffer.length | 获取buffer长度 |
buffer.copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) | 拷贝一个buffer |
buffer.slice(start, end=buffer.length) | 返回一个新的buffer对象,该对象和原有对象使用了同一块内存。(所以修改a则b跟着变化,反之一样) |
buffer.toString(encoding, start=0, end=buffer.length) | 把buffer转换成string |
buf.toJSON()
对象化一个Buffer,实际效果是将一个二进制字节数组中每一位十进制化,组成新的数组。
var buf = new Buffer('test');
console.log('buf --> ',buf);
//字串化,相当于字串化一个数组,十六进转为十进
console.log('JSON.stringify(buf)-->',JSON.stringify(buf));
//字串化后,直接转化为Buffer已经和原来的buf不同了。因为new Buffer()接受一个长度、字串、字节数组为参数
console.log('new Buffer(json)-->',new Buffer(JSON.stringify(buf)));
//字串化后,需要再对象化->转化为Buffer才是原来的东西,
console.log( 'new Buffer(JSON.parse(JSON.stringify(buf)))-->',new Buffer(JSON.parse(JSON.stringify(buf))));
//对象化,得到的是一个十进的数组,他仍然可以被直接new Buffer为原来一样的东东
console.log('buf.toJSON -->',buf.toJSON());
console.log('new Buffer(buf.toJSON())-->',new Buffer(buf.toJSON()));
//new Buffer(buf)就是自己了。
console.log('new Buffer(buf)-->',new Buffer(buf));
buf[index]#
Get and set the octet at index
. The values refer to individual bytes, so the legal range is between 0x00
and 0xFF
hex or 0
and 255
.
类方法: Buffer.concat(list, [totalLength])#
连接Buffer的数组为一个整体的Buffer
totalLength
总的字节数,提供这个可选参数将提高速度
在《深入浅出nodejs》中使用这个方法拼接Buffer
buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
buf.slice([start], [end])
类似于array.slice,注意修改原有的/新的buf都会对另一个同时修改。因为他们指向同一块内存。
buf.fill(value, [offset], [end])#
value
offset
Number, Optionalend
Number, Optional
Fills the buffer with the specified value. If the offset
(defaults to 0
) and end
(defaults to buffer.length
) are not given it will fill the entire buffer.
var b = new Buffer(50);
b.fill("h");