首頁  >  文章  >  web前端  >  NodeJS中緩衝區Buffer是什麼及實例用法詳解

NodeJS中緩衝區Buffer是什麼及實例用法詳解

伊谢尔伦
伊谢尔伦原創
2017-07-24 10:56:252697瀏覽

所謂緩衝區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的資料處理能力從字串擴展到了任意二進位資料。

總結一下

(1),JavaScript適合處理Unicode編碼數據,但對二進位資料的處理並不友善。

(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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn