能處理 Binary Data 的 Node.js Buffer Class

從一開始 JavaScript 就被設計成易於處理 Unicode 的語言,其所有的動作,都無法直接操作 Binary 類型的資料。也就是說,JavaScript 對處裡一個個位元組(byte)的資料是沒輒的,因此使用範圍大幅受限。為了解決這個問題,Node.js另外設計了一個 Buffer class,讓開發者可以處理 Binary data。

為了方便理解,其實我們可以將 buffer class 看做為 C 語言中的 malloc(),使用它就像是和直接系統要一塊原始記憶體來使用。此外,因為 buffer class 被設計成在 V8 heap 之外配置記憶體,因此不受限於 V8 Engine heap 的 1.6GB 大小限制。

你可以用下列三種方式建立 Buffer 物件:
/* 建立 16 Bytes 的記憶體空間 */
var buffer = new Buffer(16);

/* 直接代入資料陣列 */
var buffer = new Buffer([ 8, 8, 6, 9, 2, 6, 3, 3, 3, 5, 7, 2, 1, 1, 1 ]);

/* 直接代入字串 */
var buffer = new Buffer('String!', 'utf-8');
var buffer = new Buffer('String!', 'ascii');

你可以寫入資料:
var buffer = new Buffer(32);

/* 寫入一段字串 */
buffer.write('Write something', 'utf-8');

/* 只寫入兩個字元 */
buffer.write('Write something', 2, 'ascii');

以操作陣列(Array)的方法,單獨存取每個 Byte 的資料:
var buffer = new Buffer(32);

/* 將每個 byte 歸零 */
for (var i; i < buffer.length; i++) {
    buffer[i] = 0;
}

當然也有像 memcpy() 的資料複製:
var buffer1 = new Buffer('Source!');
var buffer2 = new Buffer(32);

/* buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) */
buffer1.copy(buffer2, 0, 0, 6);


後記

更多的功能,可以參考官方的 API 文件: http://nodejs.org/api/buffer.html

留言

  1. 請問 "V8 Engine heap 的 1.6GB 大小限制"
    是指在 windows 上的限制嘛?

    回覆刪除
  2. 應該是不分作業系統,1.6GB 是在 64-bit 平台上的限制,如果是在 32-bit,印像中更少。

    而 Node.js 為了因應一些開發者的要求,最近似乎有在調整這個大小。

    如果是講到 V8 Engine 原始設計的話,我記得是 1GB。

    實際情況可以參考 Node.js 的原始碼: src/heap.cc

    回覆刪除
  3. 請問Fred大大,

    在 Node.js 中有辦法得到buffer所在的記憶體位址嗎?

    謝謝!

    回覆刪除
    回覆
    1. 應該是可以,只是要自己用 C/C++ 試著去得到。聽起來你是想做壞事。:-P

      刪除
  4. 再請教一下Fred大,

    在Node.js C/C++ addon 中
    要如何去調用Buffer?
    具體來說就是能在c的函式裡宣告一個Buffer物件、將Buffer作為參數傳入及回傳Buffer物件?

    感恩:)

    回覆刪除
  5. 謝謝!

    拜讀Fred大的blog真的是獲益匪淺!

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄