欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJS模塊Buffer原理及使用方法解析

 更新時間:2020年11月11日 11:00:45   作者:酷兒q  
這篇文章主要介紹了NodeJS模塊Buffer原理及使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Buffer 作為 nodejs 中重要的概念和功能,為開發(fā)者提供了操作二進制的能力。本文記錄了幾個問題,來加深對 Buffer 的理解和使用:

  • 認識緩沖器
  • 如何申請堆外內存
  • 如何計算字節(jié)長度
  • 如何計算字節(jié)長度
  • 如何轉換字符編碼
  • 理解共享內存與拷貝內存

認識 Buffer(緩沖器)

Buffer 是 nodejs 核心 API,它提供我們處理二進制數據流的功能。Buffer 的使用和 ES2017 的 Uint8Array 非常相似,但由于 node 的特性,專門提供了更深入的 api。

Uint8Array 的字面意思就是:8 位無符號整型數組。一個字節(jié)是 8bit,而字節(jié)的表示也是由兩個 16 進制(4bit)的數字組成的。

const buf = Buffer.alloc(1);
console.log(buf); // output: <Buffer 00>

如何申請堆外內存

Buffer 可以跳出 nodejs 對堆內內存大小的限制。nodejs12 提供了 4 種 api 來申請堆外內存:

  • Buffer.from()
  • Buffer.alloc(size[, fill[, encoding]])
  • Buffer.allocUnsafe(size)
  • Buffer.allocUnsafeSlow(size)

Buffer.alloc vs Buffer.allocUnsafe

在申請內存時,可能這片內存之前存儲過其他數據。如果不清除原數據,那么會有數據泄漏的安全風險;如果清除原數據,速度上會慢一些。具體用哪種方式,根據實際情況定。

  • Buffer.alloc:申請指定大小的內存,并且清除原數據,默認填充 0
  • Buffer.allocUnsafe:申請指定大小內存,但不清除原數據,速度更快

根據提供的 api,可以手動實現一個alloc:

function pollifyAlloc(size, fill = 0, encoding = "utf8") {
  const buf = Buffer.allocUnsafe(size);
  buf.fill(fill, 0, size, encoding);
  return buf;
}

Buffer.allocUnsafe vs Buffer.allocUnsafeSlow

從命名上可以直接看出效果,Buffer.allocUnsafeSlow更慢。因為當使用 Buffer.allocUnsafe 創(chuàng)建新的 Buffer 實例時,如果要分配的內存小于 4KB,則會從一個預分配的 Buffer 切割出來。 這可以避免垃圾回收機制因創(chuàng)建太多獨立的 Buffer 而過度使用。

這種方式通過消除跟蹤和清理的需要來改進性能和內存使用。

如何計算字節(jié)長度

利用 Buffer,可以獲得數據的真實所占字節(jié)。例如一個漢字,它的字符長度是 1。但由于是 utf8 編碼的漢字,所以占用 3 個字節(jié)。

直接利用Buffer.byteLength()可以獲得字符串指定編碼的字節(jié)長度:

const str = "本文原文地址: xxoo521.com";

console.log(Buffer.byteLength(str, "utf8")); // output: 31
console.log(str.length); // output: 19

也可以直接訪問 Buffer 實例的 length 屬性(不推薦):

console.log(Buffer.from(str, "utf8").length); // output: 31

如何轉換字符編碼

Nodejs 當前支持的編碼格式有:ascii、utf8、utf16le、ucs2、base64、latin1、binary、hex。其他編碼需要借助三方庫來完成。

下面,是用Buffer.from()和buf.toString()來封裝的 nodejs 平臺的編碼轉換函數:

function trans(str, from = "utf8", to = "utf8") {
  const buf = Buffer.from(str, from);
  return buf.toString(to);
}

// output: 5Y6f5paH5Zyw5Z2AOiB4eG9vNTIxLmNvbQ==
console.log(trans("原文地址: xxoo521.com", "utf8", "base64"));

共享內存與拷貝內存

在生成 Buffer 實例,操作二進制數據的時候,千萬要注意接口是基于共享內存,還是基于拷貝底層內存。

例如對于生成 Buffer 實例的from(),不同類型的參數,nodejs 底層的行為是不同的。

為了更形象地解釋,請看下面兩段代碼。

代碼 1:

const buf1 = Buffer.from("buffer");
const buf2 = Buffer.from(buf1); // 拷貝參數中buffer的數據到新的實例
buf1[0]++;

console.log(buf1.toString()); // output: cuffer
console.log(buf2.toString()); // output: buffer

代碼 2:

const arr = new Uint8Array(1);
arr[0] = 97;

const buf1 = Buffer.from(arr.buffer);
console.log(buf1.toString()); // output: a

arr[0] = 98;
console.log(buf1.toString()); // output: b

在第二段代碼中,傳入Buffer.from的參數類型是arrayBuffer。因此Buffer.from僅僅是創(chuàng)建視圖,而不是拷貝底層內存。buf1 和 arr 的內存是共享的。

在操作 Buffer 的過程中,需要特別注意共享和拷貝的區(qū)別,發(fā)生錯誤比較難排查。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • NPM全局安裝與本地安裝的區(qū)別詳析

    NPM全局安裝與本地安裝的區(qū)別詳析

    NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,下面這篇文章主要給大家介紹了關于NPM全局安裝與本地安裝區(qū)別的相關資料,需要的朋友可以參考下
    2022-10-10
  • 從零學習node.js之搭建http服務器(二)

    從零學習node.js之搭建http服務器(二)

    NodeJs是什么我想大家已經很了解了,作為一個前端工程師,想要不斷提升自己,一般都會接觸到后端服務器的技術,NodeJs給我們提供了一個學習成本相對較低的捷徑可走。下面這篇文章主要介紹了node.js中搭建http服務器的相關資料,需要的朋友可以參考下。
    2017-02-02
  • node.js中的fs.statSync方法使用說明

    node.js中的fs.statSync方法使用說明

    這篇文章主要介紹了node.js中的fs.statSync方法使用說明,本文介紹了fs.statSync的方法說明、語法、接收參數、使用實例和實現源碼,需要的朋友可以參考下
    2014-12-12
  • node-sass一直安裝不上、安裝失敗的原因分析

    node-sass一直安裝不上、安裝失敗的原因分析

    一個項目一直以來運行都是正常的,今天運行就突然報錯了,錯誤如下:?錯誤大致意思就是node-sass安裝失敗,下面這篇文章主要給大家介紹了關于node-sass一直安裝不上、安裝失敗的原因分析,需要的朋友可以參考下
    2023-02-02
  • 解決node-sass下載不成功的問題

    解決node-sass下載不成功的問題

    這篇文章主要介紹了解決node-sass下載不成功的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • node?NPM庫string-random生成隨機字符串學習使用

    node?NPM庫string-random生成隨機字符串學習使用

    這篇文章主要為大家介紹了node?NPM庫string-random生成隨機字符串學習使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Node.js爬取豆瓣數據實例分析

    Node.js爬取豆瓣數據實例分析

    這篇文章通過實例給大家詳細分析了Node.js爬取豆瓣數據的過程以及具體方法步驟,有興趣的朋友可以參考學習下。
    2018-03-03
  • nodeJs事件循環(huán)運行代碼解析

    nodeJs事件循環(huán)運行代碼解析

    這篇文章主要為大家介紹了nodeJs事件循環(huán)運行代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • yarn?命令死循環(huán)問題分析解決

    yarn?命令死循環(huán)問題分析解決

    這篇文章主要為大家介紹了yarn?命令死循環(huán)問題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 詳解基于Koa2開發(fā)微信二維碼掃碼支付相關流程

    詳解基于Koa2開發(fā)微信二維碼掃碼支付相關流程

    這篇文章主要介紹了詳解基于Koa2開發(fā)微信二維碼掃碼支付相關流程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05

最新評論