天天看點

Node.js緩存Node.js Buffer(緩沖區)

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


      

繼續閱讀