Node.js Buffer(缓冲区)

时间:2020-12-31 12:00:28   收藏:0   阅读:0

Node.js Buffer(缓冲区)

参考https://www.runoob.com/nodejs/nodejs-buffer.html

Buffer类时Node.js的一个核心库。一个Buffer对象类似于一个整数数组,但它对应于V8引擎的堆内存之外的一块原始内存(原生内存/堆外内存/直接内存)。
建议直接使用Buffer.from()接口去创建Buffer对象。

Buffer与字符编码

Buffer实例一般用于表示编码字符的序列,比如UTF-8、UCS2、Base64或16进制编码的数据。通过显式的字符编码,就可以实现Buffer实例<=>JavaScript字符串之间的相互转换。

const buf = Buffer.from(‘runoob‘, ‘ascii‘);

// 输出72756e6f6f62
console.log(buf.toString(‘hex‘));

// 输出cnVub29i
console.log(buf.toString(‘base64‘));

Node.js目前支持的字符编码包括:

创建Buffer类实例

7种方法创建Buffer实例:

// 创建一个长度为10,且用0填充的buffer(默认用0填充)
const buf1 = Buffer.alloc(10);

// 创建一个长度为10,且用0x1填充的buffer
const buf2 = Buffer.alloc(10, 1);

// 创建一个长度为10,且未初始化的buffer
// 这个方法比Buffer.alloc()快
// 但是返回的实例种可能包含旧数据
// 因此需要用fill()或write()重写
const buf3 = Buffer.allocUnsafe(10);

// 创建一个包含[0x1, 0x2, 0x3]的buffer
const buf4 = Buffer.from([1, 2, 3]);

// 创建一个包含UTF-8字节[0x74, 0xc3, 0xa9, 0x73, 0x74]的buffer
const buf5 = Buffer.from(‘test‘);

// 创建一个包含Latin-1字节[0x74, 0xe9, 0x73, 0x74]的buffer
cosnt buf6 = Buffer.from(‘test‘, ‘latin1‘);

写入缓冲区

语法

  buffer.write(string[,offset[,length]][,encoding])

参数

返回值

返回实际写入的空间大小。

实例

var buf = Buffer.alloc(256);
var len = buf.write(‘test‘);

console.log(‘写入字节数:‘+len);

结果:

  写入字节数:4

从缓冲区读取数据

语法

  buf.toString([encoding[,start[,end]]])

返回值

返回指定编码的字符串。

var buf = Buffer.alloc(26);
for( var i=0; i<26; i++){
	buf[i] = i+97;
}
console.log(buf.toString(‘ascii‘));//使用‘ascii‘编码输出所有字符
console.log(buf.toString(‘ascii‘, 0, 5));//使用‘ascii‘编码输出前5个字符
console.log(buf.toString(‘utf8‘, 0, 5));//使用‘utf8‘编码输出前5个字符
console.log(buf.toString(undefined, 0, 5));// 使用默认的‘utf8‘编码输出前5个字符

结果:

  abcdefghijklmnopqrstuvwxyz
  abcde
  abcde
  abcde

将Buffer对象转为JSON对象

语法

  buf.toJSON()

效果等同JSON.stringfy(),其实是JSON.stringfy()调用了buf.toJSON()。

返回值

返回JSON化的JSON对象。

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

// 输出:{"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);

const copy = JSON.parse(json, (key, value)=>{
	return value && value.type===‘Buffer‘?
		Buffer.from(value.data):
		value;
});
// 输出:<Buffer 01 02 03 04 05>
console.log(copy);

结果:

  {"type":"Buffer","data":[1,2,3,4,5]}
  <Buffer 01 02 03 04 05>

缓冲区合并

语法

  Buffer.concat(list[,totalLength])

返回值

返回一个最终合并的新Buffer对象。

var buf1 = Buffer.from(‘菜鸟教程‘);
var buf2 = Buffer.from(‘www.runoob.com‘);
var buf3 = Buffer.concat([buf1, buf2]);
console.log(buf3.toString());

结果:

  菜鸟教程www.runoob.com

缓冲区比较

语法

  buf.compare(otherBuffer);

返回值

返回一个数字,类似于C语言中的strcmp()函数。0表示相同。

var buf1 = Buffer.from(‘ABC‘);
var buf2 = Buffer.from(‘ABCD‘);
var result = buf1.compare(buf2);
console.log(result);

结果:
-1

拷贝缓冲区

语法

  buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

返回值

var buf1 = Buffer.from(‘ABcdEFG‘);
var buf2 = Buffer.from(‘CD‘);

buf2.copy(buf1, 2);
console.log(buf1.toString());

结果:

  ABCDEFG

缓冲区裁剪

语法

buf.slice([start[, end]])

返回值

返回一个新的Buffer对象,和旧的指向同一块内存,只是长度不同。

var buf1 = Buffer.from(‘abCDEFG‘);
var buf2 = buf1.slice(2, 7);


console.log(buf2.toString());

结果:

  CDEFG

缓冲区长度

语法

buf.length;

返回值

返回Buffer对象所占据的内存长度。

  var buffer = Buffer.from(‘www.runoob.com‘);
  //  缓冲区长度
  console.log("buffer length: " + buffer.length);

结果:

  buffer length: 14
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!