04.缓冲区Buffer

Buffer.js 代码如下

/*----------创建Buffer实例-----------*/

//创建方法1,分配10个字节的缓存
var buf1 = new Buffer(10);

//创建方法2,指定字节数组(数组元素大小在[0,255]之间)
var buf2 = new Buffer([255,0,97,158]);

var buf2_extend = new Buffer(buf2);

//创建方法3,指定字符串(编码可为"ascii","utf8","utf16le","ucs2","base64","hex",默认为"utf-8",)
var buf3 = new Buffer('缓冲区内容','utf-8');

var buf4 = new Buffer('缓冲区内容');

/*-----------Buffer类方法------------*/

//合并缓冲区
//Buffer.concat(list[, totalLength])
var concatBuffer = Buffer.concat([new Buffer([0xaa,0xaa]),buf2]);
console.log('合并的内容:',concatBuffer);
var concatBuffer2 = Buffer.concat([new Buffer([0xaa,0xaa]),buf2],4);
console.log('限制合并总字节数的合并内容:',concatBuffer2);

/*-----------Buffer类实例属性------------*/

//返回Buffer实例的内存长度
console.log('buf4创建的缓冲区的字节长度:',buf4.length);

/*-----------Buffer类实例方法------------*/

//读取缓冲区,解码缓冲区数据并使用指定编码返回字符串
//格式如buf.toString([encoding[, start[, end]]])
//start,指定开始读取缓冲区索引的位置,默认为0
//end,结束位置(读取内容不包含end),默认为buf.length
console.log('buf4创建的缓冲区内容:',buf4.toString());

var readContent = buf4.toString('utf8',3,8);
console.log('读取buf4部分内容:',readContent,'读取的内容的字符长度为:',
			readContent.length);

//写入缓冲区并返回实际写入的字节数
//空间不足时写入部分字符串,但不写入部分字符
//格式如buf.write(string[, offset[, length]][, encoding])
//offset,开始写入缓冲区的索引值,默认为0;length,写入的字节数,默认为buf4.length-offset;
//encoding,使用的编码,默认为"utf-8"
var len = buf4.write('这里是重写的缓冲区内容,部分可见');

console.log('写入缓冲区buf4字节数:',len);
console.log('写入后buf4缓冲区内容:',buf4.toString());

//获取或设置缓冲区指定字节
console.log('buf2[2]:',buf2[2]);
buf2[2] = 98;/*0x62*/
console.log('buf2:',buf2);

//用指定的字节填充缓冲区
//格式如buf.fill(value[, offset][, end])
buf1.fill(97);
console.log('填充后的缓冲区为:',buf1.toString());

//把缓冲区字节数组转化为json的组织方式
var jsonData = buf4.toJSON();

console.log('buf4的字节数组表达方式转化为json后:',jsonData);

//比较俩换冲区,返回值为-1表示第一个缓冲区在前,0表示俩缓冲区相同,1表示第一个缓冲区在后
var compareResult = new Buffer('abcde').compare(new Buffer([97,98,99,100,101,102]));
console.log('比较后返回的数字:',compareResult);

//比较俩缓冲区是否相等,返回布尔值
var equalResult = new Buffer('abcde').equals(new Buffer([97,98,99,100,101]));
console.log('是否相等:',equalResult);

//拷贝缓冲区
//格式为buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
//targetStart默认为0,sourceStart默认为0,souceEnd默认为buf.length
buf4.copy(buf1);
console.log('拷贝自buf4的缓冲区内容:',buf1.toString());

//裁剪缓冲区,返回新的缓冲区,但裁剪区域与原缓冲区共用内存
//格式为buf.slice([start[, end]])
//负数索引从尾部算起
var sliceBuffer = buf4.slice(4);
console.log('剪切自buf4的缓冲区内容:',sliceBuffer.toString(),
          '字符长度为:',sliceBuffer.toString().length);
sliceBuffer.write('插',2);
console.log('修改sliceBuffer后buf4的内容:',buf4.toString());



var buf5 = new Buffer(7);
buf5.fill(98);
//写入无符号整数,大端对齐(最高48位)
//格式为buf.writeUIntBE(value, offset, byteLength[, noAssert])
//offset为buffer的偏移量,byteLength为从右算起写入的value字节数,noAssert默认为false
//noAssert为false时校验其它参数的有效性,此时byteLength必须等于value的字节长度
//且offset + byteLength <= buf.length;
//noAssert为true时,不校验参数的有效性;
buf5.writeUIntBE(0x1234567890ab,3,5,true);/*大端对齐依次写入34567890ab其中ab超出*/
console.log('大端对齐写入无符号整数',buf5);
buf5.fill(98);
//写入无符号整数,小端对齐(最高48位)
buf5.writeUIntLE(0x1234567890ab,3,5,true);/*小端对齐依次写入ab90785634其中34超出*/
console.log('小端对齐写入无符号整数',buf5);

buf5.writeUIntBE(300,3,4);
//读取无符号整数,大端对齐(最高48位)
//格式为buf.readUIntBE(offset, byteLength[, noAssert])
console.log('读取无符号整数内容(大端对齐):',buf5.readUIntBE(3,4));

buf5.writeUIntLE(300,3,4);
//读取无符号整数,小端对齐(最高48位)
console.log("读取无符号整数内容(小端对齐):",buf5.readUIntLE(3,4));


buf5.fill(98);
//写入有符号整数,大端对齐(最高48位)
buf5.writeIntBE(10,0,4);/*noAssert默认为false*/
//读取有符号整数,大端对齐(最高48位)
console.log('读取有符号整数内容(大端对齐):',buf5.readIntBE(0,4));/*noAssert为false*/
//写入有符号整数,小端对齐(最高48位)
buf5.writeIntLE(10,0,4);
//读取有符号整数,小端对齐(最高48位)
console.log("读取有符号整数内容(小端对齐):",buf5.readIntLE(0,4));


var fixBitNumber = new Buffer(65);
fixBitNumber.fill(0x62);
//写入8bit的无符号整数
//格式为buf.writeUInt8(value, offset[, noAssert])
fixBitNumber.writeUInt8(255,0);
//读取8bit的无符号整数
console.log('8bit的无符号整数:',fixBitNumber.readUInt8(0));

//写入16bit的无符号整数,大端对齐
//格式为buf.writeUInt16BE(value, offset[, noAssert])
fixBitNumber.writeUInt16BE(255,3);
//读取16bit的无符号整数
console.log('16bit的无符号整数(大端对齐):',fixBitNumber.readUInt16BE(3));

//写入16bit的无符号整数,小端对齐
//格式为buf.writeUInt16LE(value, offset[, noAssert])
fixBitNumber.writeUInt16LE(255,3);
//读取16bit的无符号整数
console.log('16bit的无符号整数(小端对齐):',fixBitNumber.readUInt16LE(3));


//写入32bit的无符号整数,大端对齐
//格式为buf.writeUInt32BE(value, offset[, noAssert])
fixBitNumber.writeUInt32BE(255,3);
//读取32bit的无符号整数
console.log('32bit的无符号整数(大端对齐):',fixBitNumber.readUInt32BE(3));
//写入32bit的无符号整数,小端对齐
//格式为buf.writeUInt32LE(value, offset[, noAssert])
fixBitNumber.writeUInt32LE(255,3);
//读取32bit的无符号整数
console.log('32bit的无符号整数(小端对齐):',fixBitNumber.readUInt32LE(3));



fixBitNumber.fill(0x62);
//写入8bit的有符号整数
//格式为buf.writeInt8(value, offset[, noAssert])
fixBitNumber.writeInt8(-128,0);
//读取8bit的有符号整数
console.log('8bit的有符号整数:',fixBitNumber.readInt8(0));

//写入16bit的有符号整数,大端对齐
//格式为buf.writeInt16BE(value, offset[, noAssert])
fixBitNumber.writeInt16BE(-255,3);
//读取16bit的有符号整数
console.log('16bit的有符号整数(大端对齐):',fixBitNumber.readInt16BE(3));

//写入16bit的有符号整数,小端对齐
//格式为buf.writeInt16LE(value, offset[, noAssert])
fixBitNumber.writeInt16LE(-255,3);
//读取16bit的有符号整数
console.log('16bit的有符号整数(小端对齐):',fixBitNumber.readInt16LE(3));


//写入32bit的有符号整数,大端对齐
//格式为buf.writeInt32BE(value, offset[, noAssert])
fixBitNumber.writeInt32BE(-255,3);
//读取32bit的有符号整数
console.log('32bit的有符号整数(大端对齐):',fixBitNumber.readInt32BE(3));
//写入32bit的有符号整数,小端对齐
//格式为buf.writeInt32LE(value, offset[, noAssert])
fixBitNumber.writeInt32LE(-255,3);
//读取32bit的有符号整数
console.log('32bit的有符号整数(小端对齐):',fixBitNumber.readInt32LE(3));

//32bit浮点数
fixBitNumber.writeFloatBE(30.25,1);
console.log('双浮点数大端对齐:',fixBitNumber.readFloatBE(1));
fixBitNumber.writeFloatLE(-30.25,2);
console.log('双浮点数小端对齐:',fixBitNumber.readFloatLE(2));

//64bit双精度
fixBitNumber.writeDoubleBE(64.125,1);
console.log('双精度数大端对齐:',fixBitNumber.readDoubleBE(1));
fixBitNumber.writeDoubleLE(-64.125,1);
console.log('双精度数小端对齐:',fixBitNumber.readDoubleLE(1));


 运行结果如下:

>node Buffer.js
合并的内容: <Buffer aa aa ff 00 61 9e>
限制合并总字节数的合并内容: <Buffer aa aa ff 00>
buf4创建的缓冲区的字节长度: 15
buf4创建的缓冲区内容: 缓冲区内容
读取buf4部分内容: 冲�� 读取的内容的字符长度为: 3
写入缓冲区buf4字节数: 15
写入后buf4缓冲区内容: 这里是重写
buf2[2]: 97
buf2: <Buffer ff 00 62 9e>
填充后的缓冲区为: aaaaaaaaaa
buf4的字节数组表达方式转化为json后: { type: 'Buffer',
  data: [ 232, 191, 153, 233, 135, 140, 230, 152, 175, 233, 135, 141, 229, 134,
153 ] }
比较后返回的数字: -1
是否相等: true
拷贝自buf4的缓冲区内容: 这里是�
剪切自buf4的缓冲区内容: ��是重写 字符长度为: 5
修改sliceBuffer后buf4的内容: 这里插重写
大端对齐写入无符号整数 <Buffer 62 62 62 34 56 78 90>
小端对齐写入无符号整数 <Buffer 62 62 62 ab 90 78 56>
读取无符号整数内容(大端对齐): 300
读取无符号整数内容(小端对齐): 300
读取有符号整数内容(大端对齐): 10
读取有符号整数内容(小端对齐): 10
8bit的无符号整数: 255
16bit的无符号整数(大端对齐): 255
16bit的无符号整数(小端对齐): 255
32bit的无符号整数(大端对齐): 255
32bit的无符号整数(小端对齐): 255
8bit的有符号整数: -128
16bit的有符号整数(大端对齐): -255
16bit的有符号整数(小端对齐): -255
32bit的有符号整数(大端对齐): -255
32bit的有符号整数(小端对齐): -255
双浮点数大端对齐: 30.25
双浮点数小端对齐: -30.25
双精度数大端对齐: 64.125
双精度数小端对齐: -64.125

猜你喜欢

转载自itnotesblog.iteye.com/blog/2393675