Buffer的写入方法

node.js 为读取和写入Buffer对象的类型数据,提供了相关方法。

buf.writeXXX(value, offset, [noAssert]);

value 参数,要写入的值,这个值必须是整数或浮点数,不可省略
offset 参数,写入的起始位置,不可省略。

noAssert[可选]参数,
默认false当超出buf的范围时会抛出异常,
设置true超出buf范围不会抛出异常,写入范围内的byte,丢弃超出的部分。

node.js 读取和写入数据,支持的类型有: Int8八位有符号整数、UInt8八位无符号整数、Int16LE/Int16BE十六位有符号整数、UInt16LE/UInt16BE十六位无符号整数、UInt32LE/UInt32BE三十二位无符号整数、Int32LE/Int32BE三十二位有符号整数、FloatLE/FloatBE三十二位单精度浮点数、DoubleLE/DoubleBE六十四位双精度浮点数。

首先我们通过写入一个整数,对比这几种数据结构。

例1

var buf = new Buffer(4), 
    num = 0x0c; // 0x0c是整数12的十六进制形式
buf.fill(); // 清空

buf.writeInt8(num,0);
console.log(buf); //buf.fill();

buf.writeUInt8(num,0);
console.log(buf); //buf.fill();

buf.writeInt16BE(num,0);
console.log(buf); //buf.fill();

buf.writeUInt16BE(num,0);
console.log(buf); //buf.fill();

buf.writeInt16LE(num,0);
console.log(buf); //buf.fill();

buf.writeUInt16LE(num,0);
console.log(buf); //buf.fill();

buf.writeInt32BE(num,0);
console.log(buf); //buf.fill();

buf.writeUInt32BE(num,0);
console.log(buf); //buf.fill();

buf.writeInt32LE(num,0);
console.log(buf); //buf.fill();

buf.writeUInt32LE(num,0);
console.log(buf); //buf.fill();

通过这个例子说明,LE 和 BE的区别是数据结构的排列顺序正好颠倒,例如Int16BE用<00 0c="">结构储存12,Int16LE用<0c 00="">结构储存。UIntXXX表示无符号IntXXX表示有符号。另外,我们温习一下,八位占用1个byte,16位占用2个byte,32位占用4个byte,64占用8个byte,位数的由来是因为一个byte有8个bit。位数越高表达的数的范围就越大。

浮点和整数大同小异,例:

var buf = new Buffer(8), 
    num = 210.567;
buf.fill();

buf.writeFloatBE(num,0);
console.log(buf); //buf.fill();

buf.writeFloatLE(num,0);
console.log(buf); //buf.fill();

buf.writeDoubleBE(num,0);
console.log(buf); //buf.fill();

buf.writeDoubleLE(num,0);
console.log(buf); //buf.fill

还有一个buf.fill方法,用来填充Buffer对象的,但这个方法并不是表面理解的那样。god

fuck前面用到了不带参数的fill方法,可以清空整个Buffer对象。

下面我们详细分析一下这个方法的用法。

buf.fill(value, [offset], [end])

value 参数,表示填充值 [但这里要注意:fill内部只会用值数据的第一个byte进行填充]
offset[可选]参数,填充的开始位置,默认0,如果超出buf范围会抛出异常。
end[可选]参数,填充的结束位置,默认buf.length,如果超出buf范围会抛出异常。

例1

var buf = new Buffer(4);                      

buf.fill();        // 清空
console.log(buf);  //var value = new Buffer("你好","utf16le"); 
console.log(value);//buf.fill("你好");  // 填充整个buf
console.log(buf);  //

这个例子我们看到“你好”占用的第一个字节 0x60 填充了整个buf,之所以采用utf16le,因为这是fill方法内部的默认编码。

例2

var buf = new Buffer(4);  

buf.fill(0);
buf.fill("你好",2);  // 填充buf的3~4的byte
console.log(buf);    //buf.fill(0);
buf.fill("你好",2,3);// 填充buf的第三个byte
console.log(buf);    //