利用Buffer类处理缓冲区、编码/解码二进制数据

 2015年03月06日    567     声明


javascript 最初是被设计为处理html文档的,因此并不善于处理二进制数据。但在后端开发中离不开对二进制数据的处理,为此Node提供了Buffer类,该类封装了对访问连续内存块的操作,可以处理内存中的数据及创建、切分缓冲区,还可以在两个缓冲区之间复制内存数据。

  1. 创建缓冲区
  2. 缓冲区数据的获取和设置
  3. 缓冲区数据解码、转码
  4. 缓冲区的切分、复制


1. 创建缓冲区

用字符串创建缓冲区

var buffer = new Buffer('Hello Node');

Node默认使用UTF-8格式编码,也可以使用其它编码格式的字符串创建缓冲区,制定编码格式作为构造函数的第二个参数即可:

var buffer = new Buffer('48656c6c6f204e6f6465', 'hex');

可接受的编码格式包括:ascii、utf8、utf16le(ucs2)、base64、binary、hex

缓冲区没有具体初始化内容时,可以指定长度来创建缓冲区,例如,创建长度为1024字节的缓冲区:

var buffer = new Buffer(1024);


2. 缓冲区数据的获取和设置

获取指定位置的内容:

var buffer = new Buffer('Hello Node');

console.log(buffer[3]);        // ->108

设置指定位置的内容:

var buffer = new Buffer('Hello Node');
buffer[3]=109;			//设置第4位的数据
console.log(buffer.toString());			//->Helmo Node


3. 缓冲区数据解码、转码

缓冲区转换为UTF-8格式的字符串:

var buffer = new Buffer('Hello Node');
console.log(buffer.toString());			//->Hello Node

将缓冲区数据转换为base64格式字符串:

var buffer = new Buffer('Hello Node');
console.log(buffer.toString('base64'));			//  ->  SGVsbG8gTm9kZQ==

将base64编码的字符串,转换为UTF-8编码:

var base64String = 'SGVsbG8gTm9kZQ==';
var buffer = new Buffer(base64String, 'base64');
var utf8String = buffer.toString('utf8');
console.log(utf8String);				//   ->  Hello Node


4. 缓冲区的切分、复制

缓冲区创建后,需要将一部分数据提取出来时,可以通过指定起始和结束位置来切分缓冲区:

var longBuffer = new Buffer('this is a long Buffer');
var smallBuffer = longBuffer.slice(5, 12);
console.log(smallBuffer.toString());		//	->	is a lo

缓冲区切分并没有分配新的内存,还是使用的父缓冲区的内存区域,只是引用了父缓冲区不同的起始/结束位置。修改父缓冲区重合部分的数据,修改也会影响子缓冲区,修改子缓冲区也会影响父缓冲区。父缓冲区操作结束后,由于子缓冲区还存在,因此内存依然被保留,使用不当会造成内存泄漏。

使用copy方法代替slice可以将数据从一个缓冲区复制到另一个缓冲区,解决内存泄漏问题:

var longBuffer = new Buffer('this is a long Buffer');
var smallBuffer = new Buffer(7); longBuffer.slice(5, 12);
longBuffer.copy(smallBuffer, 0, 5, 12)
smallBuffer[3] = 119;
console.log(smallBuffer.toString());		//	->	is w lo
console.log(longBuffer.toString());		// ->  this is a long Buffer //父缓冲区未子缓冲区修改的影响

下一篇:npm包管理机制