Buffer对象
Buffer对象是Node处理二进制数据的一个接口。它是Node原生提供的全局对象,可以直接使用,不需要require('buffer')。虽然javascript对于字符串的操作十分友好。但是,在node中,很多的操作都会处理大量的二进制数据,比如文件处理,网络协议处理,图片处理。javascript自有的字符串远远不能满足这些要求,于是Buffer对象应运而生。

模块

Buffer是一个典型的javascript和c++结合的模块,它将性能相关的部分用c++实现,而将非性能相关的部分用js实现。node在进程启动的时候就已经加载了Buffer,所以无需require。

内存分配

Buffer对象的内存分配不是在V8的堆内存中,而是在node的c++层面实现的内存的申请的。node采用了slab分配机制,动态内存管理,slab包含三种状态,slab具有如下三种状态:
full:完全分配状态
partial: 部分分配状态
empty:没有被分配状态 。
我们可以指定Buffer对象的大小

new Buffer(size)

node以8KB为界限区分Buffer是大对象还是小对象(Buffer.poolSize=8*1024),即8kb为slab单元大小,js以它为单元分配内存。

Buffer对象

Buffer对象类似于数组,它的元素为16进制的两位数,即0-255的数值。

clipboard.png

上面的代码会,新建一个保存str字符串的buffer 对象。
使用指定的编码方式将字符串写入buffer,然后返回实际写入的大小。如果buffer 空间不足, 则只会写入部分字符串。在本例中使用'utf8'编码,这种方式不会写入半个字符。

Buffer的转换

Buffer对象可以与字符串相互转换,目前支持的字符串编码类型有一下几种。

  1. ASCII

  2. UTF-8

  3. UTF-16LE/UCS-2

  4. Base64

  5. Binary

  6. Hex

字符串转buffer,使用构造函数new Buffer(str,[encoding]),默认是UTF-8编码。
Buffer转字符串也很简单,Buffer对象的toString方法可以将Buffer转成字符串。

var buf = new Buffer('Buffer Test')
buf.toString()

Buffer拼接

正确的拼接方式是用一个数组来存储接收到的所有Buffer片段,并记录所有片段的总长度,然后调用Buffer的concat()方法生成一个合并的Buffer对象。

var chunks = []
var size = 0
res.on('data', function(chunk) {
    chunks.push(chunk)
    size += chunk.length
})
res.on('end', function() {
    var buf = Buffer.concat(chunks, size)
    var str = iconv.decode(buf, 'utf8')
    console.log(str)
})

wupengyu
1.8k 声望166 粉丝

写作是为了更好的思考