nodejs系列(4)Buffer(缓冲器)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zeping891103/article/details/79174552

JavaScript的数据类型有字符串、数字、布尔、数组、对象、Null、Undefined,但是却没有处理二进制的数据类型。然而在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

(注)Buffer 类在 Node.js 中是一个全局变量,因此调用时无需使用 require('buffer').Buffer。


什么是Buffer?

举个例子,以字符串为例,字符串与Buffer的应用关系如下:

数据A(字符串+该字符串的编码) => Buffer对象 => 网络传输或读写 => 解码Buffer => 数据A

(注)编码解码默认的都是UTF-8,所以在实际中无需特意修改编码和解码格式,除非有特殊需求。

按照上面的规则,我们创建一个Buffer对象如下:

var buf = Buffer.from('你好', 'utf-8');
console.log(buf.toString('utf-8')); //你好
数据A就是'你好+utf-8',buf就是Buffer对象,buf.toString('utf-8')就是按格式解码为字符串,最后打印出'你好'。由于默认编码和解码都是utf-8,上例中可以写成:
var buf = Buffer.from('你好');
console.log(buf.toString()); //你好
如果我们换种编码会怎么样?比如说用hex,将每个字节编码为两个十六进制字符。
var buf = Buffer.from('e4bda0e5a5bd', 'hex');
console.log(buf.toString('hex')); //e4bda0e5a5bd
console.log(buf.toString()); //你好
hex编码的e4bda0e5a5bd字符串实际上就是utf-8编码的'你好',更形象的说就是汉语'你好'等于英语的'Hello'一样,不同的编码可以理解成不同国家的语言,buf就是全世界都通用的世界语,世界语'你好'可以转为汉语'你好'或者英语的'Hello',而这个世界语就是计算机可以理解的语言。


创建固定长度的Buffer

通过Buffer.from('字符串')创建的Buffer空间长度等于字符串的长度,若需指定空间大小的Buffer,可以通过Buffer.alloc(长度)定义,如

var buf = Buffer.alloc(256);
buf.write("你好", 0, 3);
console.log(buf.toString()); //你
buf.write("你好");
console.log(buf.toString()); //你好
上例中创建了长度为256的Buffer,第一段写入中,写入位置为0-3,这个位置只够写入一个'你'字,因为一个汉字占3个Buffer长度空间。若没有设置具体的开始位置和结束位置时,将在0位置开始全部写入,故第二段中写入了'你好'。


合并Buffer

在实际应用中,如需实现断点续载,我们就要将多个Buffer合并组成一个更大的Buffer,合并方法可以使用:Buffer.concat(list[, totalLength])。

var buffer1 = Buffer.from('欢迎大家来到');
var buffer2 = Buffer.from('中国');
var buffer3 = Buffer.concat([buffer1, buffer2], 12); //12为buffer3的空间长度
console.log("合并内容:" + buffer3.toString()); // 合并内容:欢迎大家
console.log("合并长度:" + buffer3.length); // 合并长度:12
var buffer4 = Buffer.concat([buffer1, buffer2]);
console.log("合并内容:" + buffer4.toString()); // 合并内容:欢迎大家来到中国
console.log("合并长度:" + buffer4.length); // 合并长度:24
buffer3有设置了空间长度为12,buffer4为自动设定长度(buffer1+buffer2的长度总和),故buffer3仅显示是' 欢迎大家',而buffer4则全部显示了'欢迎大家来到中国'。


比较Buffer

比较两个Buffer是否相同,使用Buffer.compare(buf1, buf2)。

var buffer1 = Buffer.from('你好');
var buffer2 = Buffer.from('e4bda0e5a5bd', 'hex');
var result = buffer1.compare(buffer2);
if(result == 0) {
	console.log(buffer1 + " 与 " + buffer2 + " 相同");
} else {
	console.log(buffer1 + " 与 " + buffer2 + " 不同");
}
//打印 :  你好 与 你好 相同
上面utf-8编码的'你好'与hex编码的'e4bda0e5a5bd',对计算机来说实际上时同一个意思。


拷贝Buffer

 将一个Buffer的内容拷贝到另一个Buffer,使用buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])。

var buf1 = Buffer.from('12345');
var buf2 = Buffer.from('6789');
buf2.copy(buf1, 2);
console.log(buf1.toString()); //12678
//buf2.copy(buf1, 2, 1, 2);
//console.log(buf1.toString()); //12745
//buf2.copy(buf1, 0);
//console.log(buf1.toString()); //67895
上例中,指将buf2的内容拷贝至buf1,targetStart表示插入buf1位置,sourceStart表示buf2的将要被复制的开始位置,sourceEnd表示buf2的将要被复制的结束位置。


裁剪Buffer

裁剪Buffer是指将已有Buffer进行拆分,取出部分可用内容,裁剪Buffer使用buf.slice([start[, end]])。

var buffer1 = Buffer.from('helloworld');
var buffer2 = buffer1.slice(0, 2);
console.log(buffer2.toString()); //he
有关Buffer的其它API,具体可以参考Node中文网的文档。

猜你喜欢

转载自blog.csdn.net/zeping891103/article/details/79174552