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) })