注意,当切分一个缓冲的时候并没有新的内存被分配或复制,新的缓冲使用父缓冲的内存,它只是父缓冲某段数据(由起始位置指定)的引用。这段话含有几个意思。
首先,如果你的程序修改了父缓冲的内容,这些修改也会影响相关的子缓冲,因为父缓冲和子缓冲是不同的JavaScript对象,因此很容易忽略这个问题,并导致一些潜在的bug。
其次,当你用这种方式从父缓冲创建一个较小的子缓冲时,父缓冲对象在操作结束后依然会被保留,并不会被垃圾回收,如果不注意的话,很容易会造成内存泄露。
注意:如果你担心因此产生内存泄露问题,你可以使用copy方法来替代slice操作,下面将会介绍copy。
复制缓冲数据
你可以像这样用copy将缓冲的一部分复制到另外一个缓冲:
复制代码 代码如下:
var buffer1 = new Buffer("this is the content of my buffer");
var buffer2 = new Buffer(11);
var targetStart = 0;
var sourceStart = 8;
var sourceEnd = 19;
buffer1.copy(buffer2, targetStart, sourceStart, sourceEnd);
console.log(buffer2.toString()); // -> "the content"
上面代码,复制源缓冲的第9到20个字节到目标缓冲的开始位置。
解码缓冲数据
缓冲数据可以这样转换成一个UTF-8字符串:
复制代码 代码如下:
var str = buf.toString();
还可以通过指定编码类型来将缓冲数据解码成任何编码类型的数据。比如,你想把一个缓冲解码成base64字符串,可以这么做:
复制代码 代码如下:
var b64Str = buf.toString("base64");
使用toString函数,你还可以把一个UTF-8字符串转码成base64字符串:
复制代码 代码如下:
var utf8String = 'my string';
var buf = new Buffer(utf8String);
var base64String = buf.toString('base64')
小结
有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。
你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。
您可能感兴趣的文章: