Buffer对象Buffer对象是Node处理二进制数据的接口。是Node原生提供的全局对象,无需require('buffer')即可直接使用。虽然javascript对字符串操作很友好。但是在node中,很多操作都是处理大量的二进制数据,比如文件处理、网络协议处理、图像处理等。JavaScript自身的字符串远远不能满足这些要求,于是Buffer对象应运而生。ModuleBuffer是javascript和c++的典型结合。性能相关部分用c++实现,非性能相关部分用js实现。Node在进程启动的时候已经加载了Buffer,所以不需要require。内存分配Buffer对象的内存分配并不是在V8的堆内存中,而是在node的C++层面实现的内存申请。Node采用slab分配机制和动态内存管理。slab包含三个状态。slab有以下三种状态:full:完全分配状态partial:部分分配状态empty:未分配状态。我们可以指定Buffer对象的大小。newBuffer(size)节点以8KB为界区分Buffer是大对象还是小对象(Buffer.poolSize=8*1024),即8kb是slab单元的大小,js分配基于它的记忆。Buffer对象Buffer对象类似于数组,其元素为两位十六进制数,即0-255的值。上面的代码将创建一个新的缓冲区对象来保存str字符串。使用指定的编码方式将字符串写入缓冲区,然后返回实际写入的大小。如果缓冲区空间不足,则只写入部分字符串。本例使用'utf8'编码,半个字符不这样写。缓冲区转换缓冲区对象可以与字符串相互转换。当前,支持多种类型的字符串编码。ASCIIUTF-8UTF-16LE/UCS-2Base64BinaryHex字符串进行缓冲,使用构造函数newBuffer(str,[encoding]),默认为UTF-8编码。将Buffer转换为字符串也很简单。Buffer对象的toString方法可以将Buffer转成字符串。varbuf=newBuffer('BufferTest')buf.toString()Buffer拼接正确的拼接方式是用一个数组存储所有接收到的Buffer分片,记录所有分片的总长度,然后调用Buffer的concat()方法生成合并的Buffer对象。varchunks=[]varsize=0res.on('data',function(chunk){chunks.push(chunk)size+=chunk.length})res.on('end',function(){varbuf=Buffer.concat(块,大小)varstr=iconv.decode(buf,'utf8')console.log(str)})
