Node.js缓冲区基本操作

Node.js缓冲区基本操作

创建缓冲区

先来看代码:

1
2
3
4
5
var buffer = new Buffer('Hello, Node.js!');

var buf = new Buffer('Hello, Node.js!', 'base64');

var buff = new Buffer(1024);

上面代码展示了利用 new Buffer(),来创建缓冲区。当需要指定内容初始化缓冲区,有两个参数可选,第一个为需要初始化的内容,第二个为指定编码格式。当不需要初始化内容时,可以通过指定容量大小来创建缓冲区。

可以接受的编码格式为:

1 ascii : ASCII。该编码格式仅适用于ASCII字符集。
2 utf8 : UTF-8。utf8是默认编码格式。
3 base64 : Base64。 这种编码格式基于64个可打印ASCII字符来表示二进制数据,Base64通常用于在字符文档内嵌入可以转换成字符串的二进制数据,在需要时又可以完整无损地转换回原来的二进制格式。

在缓冲区设置和获取数据

当创建或者获取缓冲区后,可以使用[]操作符来查看或者修改缓冲区中的某个字节。

1
2
3
var buff = new Buffer('Hello, Node.js');
//访问缓冲区数据
console.log(buff[4]);//111

当创建一个已被初始化的缓冲区,缓冲区的数据并非是0,而是一些随机值。

修改任意位置上的数据:

1
buff[4] = 123;
  • 如果将缓冲区某个位置设置为一个大于255的数,将会用256对该数取模,最终将模取模结果赋给该位置。
  • 如果将缓冲区某位置设置为256,则实际赋值为0.
  • 如果将缓冲区某位置设置为类似100.9这样的小数,则仅会存储整数部分。
  • 如果尝试给超出缓冲区边界的位置赋值,则赋值失败,缓冲区无变化。

缓冲区长度,可以用.length属性获得。

切分缓冲区

1
2
3
var buffer = new Buffer('test test test new buffer');
var sliceBuffer = buffer.slice(5,9);
console.log(sliceBuffer.toString());//test

切分缓冲区,并没有分配新的内存,也没进行任何复制,新缓冲区还是使用父缓冲区的内存区域。只是引用了父缓冲区不同的起始位置、结束位置。利用这种方法从父缓冲区创建一个较小的子缓冲区,父缓冲区在操作结束后会被保留,并不会被垃圾收集器回收,如果不谨慎处理,很容易造成内存泄漏。

如果担心因父缓冲区保留而产生内存泄漏问题,可以使用copy方法替代slice方法。

复制缓冲区

1
2
3
4
5
6
7
8
9
var buffer = new Buffer('12345678901234567890');
var copyBuffer = new Buffer(4);

var targetStart = 0;
var sourceStart = 8;
var sourceEnd = 12;

buffer.copy(copyBuffer, targetStart, sourceStart, sourceEnd);
console.log(copyBuffer.toString());//9012

上面代码将源缓冲区的第8-12位置上的数据复制到目标缓冲区的起始位置。

缓冲区解码

1
var str = buf.toString();

可以指定编码格式:

1
var base64str = buf.toString('base64');