Node.js Buffer(緩沖區)
JavaScript 語言自身隻有字元串資料類型,沒有二進制資料類型。
但在處理像TCP流或檔案流時,必須使用到二進制資料。是以在 Node.js中,定義了一個 Buffer 類,該類用來建立一個專門存放二進制資料的緩存區。
在 Node.js 中,Buffer 類是随 Node 核心一起釋出的核心庫。Buffer 庫為 Node.js 帶來了一種存儲原始資料的方法,可以讓 Node.js 處理二進制資料,每當需要在 Node.js 中處理I/O操作中移動的資料時,就有可能使用 Buffer 庫。原始資料存儲在 Buffer 類的執行個體中。一個 Buffer 類似于一個整數數組,但它對應于 V8 堆記憶體之外的一塊原始記憶體。
Buffer 與字元編碼
Buffer 執行個體一般用于表示編碼字元的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六進制編碼的資料。 通過使用顯式的字元編碼,就可以在 Buffer 執行個體與普通的 JavaScript 字元串之間進行互相轉換。
const buf = Buffer.from('runoob', 'ascii');
// 輸出 72756e6f6f62
console.log(buf.toString('hex'));
// 輸出 cnVub29i
console.log(buf.toString('base64'));
Node.js 目前支援的字元編碼包括:
- ascii - 僅支援 7 位 ASCII 資料。如果設定去掉高位的話,這種編碼是非常快的。
- utf8 - 多位元組編碼的 Unicode 字元。許多網頁和其他文檔格式都使用 UTF-8 。
- utf16le - 2 或 4 個位元組,小位元組序編碼的 Unicode 字元。支援代理對(U+10000 至 U+10FFFF)。
- ucs2 - utf16le 的别名。
- base64 - Base64 編碼。
- latin1 - 一種把 Buffer 編碼成一位元組編碼的字元串的方式。
- binary - latin1 的别名。
- hex - 将每個位元組編碼為兩個十六進制字元。
将 Buffer 轉換為 JSON 對象
文法
将 Node Buffer 轉換為 JSON 對象的函數文法格式如下:
buf.toJSON()
當字元串化一個 Buffer 執行個體時,
JSON.stringify()會隐式地調用該 toJSON()。
傳回值
傳回 JSON 對象。
執行個體
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
// 輸出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);
const copy = JSON.parse(json, (key, value) => {
return value && value.type === 'Buffer' ?
Buffer.from(value.data) :
value;
});
// 輸出: <Buffer 01 02 03 04 05>
console.log(copy);
執行以上代碼,輸出結果為:
{"type":"Buffer","data":[1,2,3,4,5]}
<Buffer 01 02 03 04 05>
緩沖區裁剪
Node 緩沖區裁剪文法如下所示:
buf.slice([start[, end]])
參數
參數描述如下:
- start - 數字, 可選, 預設: 0
- end - 數字, 可選, 預設: buffer.length
傳回一個新的緩沖區,它和舊緩沖區指向同一塊記憶體,但是從索引 start 到 end 的位置剪切。
var buffer1 = Buffer.from('runoob');
// 剪切緩沖區
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());
buffer2 content: ru
裁剪功能傳回的實際是原始緩存區 buffer 或者一部分,操作的是與原始 buffer 同一塊記憶體區域。
// 裁剪
var buffer_origin = Buffer.from('runoob');
var buffer_slice = buffer_origin.slice(0,2);
console.log("buffer slice content: "+buffer_slice.toString());
console.log("buffer origin content: "+buffer_origin.toString());
buffer_slice.write("wirte"); // Write buffer slice
// 裁剪前與原始字元串的改變
console.log("buffer slice content: "+buffer_slice.toString());
console.log("buffer origin content: "+buffer_origin.toString());
輸出:
buffer slice content: ru
buffer origin content: runoob
buffer slice content: wi
buffer origin content: winoob
可以看到對裁剪傳回的 buffer 進行寫操作同時,也對原始 buffer 進行了寫操作。
摘自:http://www.runoob.com/nodejs/nodejs-buffer.html