能處理 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 物件:
你可以寫入資料:
以操作陣列(Array)的方法,單獨存取每個 Byte 的資料:
當然也有像 memcpy() 的資料複製:
後記
更多的功能,可以參考官方的 API 文件: http://nodejs.org/api/buffer.html
為了方便理解,其實我們可以將 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
請問 "V8 Engine heap 的 1.6GB 大小限制"
回覆刪除是指在 windows 上的限制嘛?
應該是不分作業系統,1.6GB 是在 64-bit 平台上的限制,如果是在 32-bit,印像中更少。
回覆刪除而 Node.js 為了因應一些開發者的要求,最近似乎有在調整這個大小。
如果是講到 V8 Engine 原始設計的話,我記得是 1GB。
實際情況可以參考 Node.js 的原始碼: src/heap.cc
請問Fred大大,
回覆刪除在 Node.js 中有辦法得到buffer所在的記憶體位址嗎?
謝謝!
應該是可以,只是要自己用 C/C++ 試著去得到。聽起來你是想做壞事。:-P
刪除再請教一下Fred大,
回覆刪除在Node.js C/C++ addon 中
要如何去調用Buffer?
具體來說就是能在c的函式裡宣告一個Buffer物件、將Buffer作為參數傳入及回傳Buffer物件?
感恩:)
直接建立 Buffer 物件即可。 :-)
刪除謝謝!
回覆刪除拜讀Fred大的blog真的是獲益匪淺!