Buffer 对象

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

模块

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

内存分配

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

new Buffer(size)

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

Buffer对象

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

clipboard.png

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

Buffer的转换

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

  1. ASCII性能

  2. UTF-8ui

  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)
})
相关文章
相关标签/搜索