所謂緩衝區Buffer,就是 "暫時存貯區" 的意思,是暫時存放輸入輸出資料的一段記憶體。
JS語言本身只有字串資料類型,沒有二進位資料類型,因此NodeJS提供了一個與String對等的全域建構子Buffer來提供對二進位資料的運算。除了可以讀取檔案得到Buffer的實例外,還能夠直接構造,例如:
var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
Buffer與字串類似,除了可以用.length屬性得到位元組長度外,還可以用[index]方式讀取指定位置的字節,例如:
buffer[0] ; // 0x68;
Buffer與字串能夠互相轉化,例如可以使用指定編碼將二進位資料轉化為字串:
var str = buffer.toString("utf-8"); // hello
將字串轉換為指定編碼下的二進位資料:
var buffer= new Buffer("hello", "utf-8") ; // <Buffer 68 65 6c 6c 6f>
一點點區別:
Buffer與字串有一個重要區別。字串是唯讀的,並且對字串的任何修改得到的都是一個新字串,原始字串保持不變。
至於Buffer,比較像是可以做指標運算的C語言陣列。例如,可以用[index]方式直接修改某個位置的位元組。
slice方法也不是傳回一個新的Buffer,而更像是傳回了指向原Buffer中間的某個位置的指針,如下所示。
[ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]
^ ^
)
因此對slice方法傳回的Buffer的修改會作用於原Buffer,例如:
var buffer= new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; var sub = bin.slice(2) ; sub[0] = 0x65 ; console.log(buffer) ; // <Buffer 68 65 65 6c 6f>如果想要拷貝一份Buffer,得先建立一個新的Buffer,並透過.copy方法把原Buffer中的資料複製過去。 這個類似於申請一塊新的內存,並且複製已有內存中的資料。以下是一個例子。
var buffer= new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; var dup = new Buffer(bin.length) ; buffer.copy(dup) ; dup[0] = 0x48 ; console.log(buffer) ; // <Buffer 68 65 6c 6c 6f> console.log(dup) ; // <Buffer 48 65 65 6c 6f>總之,Buffer將JS的資料處理能力從字串擴展到了任意二進位資料。
總結一下
(2),所以處理TCP流或檔案系統時,對八位元組流的處理很有必要。
(3),Node有幾個用於處理,創建和消耗八位元組流的方法。
(4),原始資料存放在一個Buffer實例中,一個Buffer類似一個整數數組,但是它的內存,分配在V8堆疊外。一個Buffer的大小是不能更改的。
(5),處理的編碼類型有:ascii,utf8,utf16le,ucs2(utf16le的別名),base64,binary,hex。
(6),Buffer為全域元素,直接new Buffer()就得到一個Buffer實例。
以上是NodeJS中緩衝區Buffer是什麼及實例用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!