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对象相似于数组,它的元素为16进制的两位数,即0-255的数值。数组
上面的代码会,新建一个保存str字符串的buffer 对象。
使用指定的编码方式将字符串写入buffer,而后返回实际写入的大小。若是buffer 空间不足, 则只会写入部分字符串。在本例中使用'utf8'编码,这种方式不会写入半个字符。网络
Buffer对象能够与字符串相互转换,目前支持的字符串编码类型有一下几种。函数
ASCII性能
UTF-8ui
UTF-16LE/UCS-2编码
Base64
Binary
Hex
字符串转buffer,使用构造函数new Buffer(str,[encoding]),默认是UTF-8编码。
Buffer转字符串也很简单,Buffer对象的toString方法能够将Buffer转成字符串。
var buf = new Buffer('Buffer Test') buf.toString()
正确的拼接方式是用一个数组来存储接收到的全部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) })