1. 程式人生 > >node 之 Buffer 筆記

node 之 Buffer 筆記

eof 占用 性能 參考 encoding 內部 Coding child water

1. Buffer 相關

  • js 最初是被設計來處理 html的,因此它不善於處理二進制數據,只有數值和字符串類型。而 node 是基於 js 的,因為 node 需要實現一些譬如數據庫通信、操作圖像及文件上傳等,只是用字符串來操作完成這些任務是相當困難的,且費資源,速度緩慢,還不安全。所以,node 就引入了一個二進制緩沖區 Buffer 來實現。

  • Buffer 類的另一個特別之處是數據占用的內存並不是分配在 js VM 內存堆中,這些對象不會被垃圾收集算法處理,它會占據一個不被修改的永久內存地址,這樣就避免了因緩沖區內容的內存復制所造成的 cpu 浪費。
  • 當創建一個已經被初始化的緩沖區時,緩沖區中包含的數據並非是 0,而是一些隨機值。
var buf = new Buffer(‘1234asdf‘);
console.log(buf[i])  // i ∈ [0, 7] eg: buf[1] 可能為任意隨機值 
  • 如果某個位置設置為一個大於 255 的數,那麽將會用 256 對概述取模,最終取模結果賦給該位置;設置為小數,則會取整;給超出邊界的位置賦值,會失敗,緩沖區不會發生變化
    技術分享圖片
  • 可以從父緩沖區切分一塊更小的緩沖區。子緩沖區延用父緩沖區的內存區域;父變子可能變;這種方式,父緩沖區在操作結束後依然繼續保留,並不會並垃圾收集器回收,處理不慎很容易內存泄漏。可用 copy 方式來代替 slice 方式。
var buffer = new Buffer("My name is Mobro Zhu");
var childBuffer = buffer.slice(11);
console.log(childBuffer)
console.log(childBuffer.toString())
console.log(buffer.toString())  //  緩沖區解碼

// copy 方式
var childBuffer2 = new Buffer(11);
buffer.copy(childBuffer2, 0, 11)
// === buffer.copy(childBuffer2, 0, 11, 19)
console.log(childBuffer2.toString());   // Mobro Zhu

2. Buffer API (參考地址: https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html)
Class Method: Buffer.alloc(size[, fill[, encoding]])

聲明一個 Buffer; size 是必須參數。這裏的 fill 可以是數字,字符串,但好像不能是數組,對象;而且,"12" 和 12 的結果是不相同的;

與此類似的有:
Buffer.allocUnsafe(size) Buffer.alloc(size, fill) 永遠不會使用這個內部的 Buffer 池,但如果 size 小於或等於 Buffer.poolSize 的一半, Buffer.allocUnsafe(size).fill(fill) 會使用這個內部的 Buffer 池.
Buffer.allocUnsafeSlow(size)

這個方法通過像大多數持久對象一樣消除追蹤與清理的需求,改善了性能與內存使用。

const buf = Buffer.alloc(10, "abc", "utf-8");
console.log(buf.toString())     // abc
//////
buf = Buffer.alloc(2)
buf.fill("12", "base64")    // buf.fill(fill, encoding)
console.log(buf.toString("base64")) // 為什麽不是 12,而是 19c=

// base64 的聲明方式
const buf = Buffer.alloc(11, ‘aGVsbG8gd29ybGQ=‘, ‘base64‘);
console.log(buf);

常見的 API:
Buffer.byteLength(string[, encoding]) 字符串的實際字節長度。
Buffer.from()
Buffer.compare(buf1, buf2) 類似 Array.compare()
Buffer.concat(list[, totalLength])
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
Buffer.from(object[, offsetOrEncoding[, length]])
Buffer.isBuffer(obj)
Buffer.isEncoding(encoding)
Buffer.poolSize 緩沖池

Buffer.concat([buf1, buf2, buf3], totalLength)

常見的實例 API:
buf.buffer 指向創建該 Buffer 的底層的 ArrayBuffer 對象

// buf.buffer
const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer);

沾沾人氣聽聽熱鬧,人才不會固步自封,被憋死在孤獨的絕壁裏。
人間煙火是好東西,瑣碎而溫暖。
一一 俗念親 《每次跳樓,都看見那廝在鋪救生氣墊》

node 之 Buffer 筆記