2012年3月23日 星期五

能處理 Binary Data 的 Node.js Buffer Class

Standard
從一開始 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