您好,登錄后才能下訂單哦!
這篇文章主要介紹了NodeJS中的Buffer有什么用,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
如同官方 API 中介紹的那樣,在 ES6 引入 TypedArray 之前,JavaScript 沒有讀取或者操作二進制數(shù)據(jù)流的機制。 Buffer 類作為 NodeJS API 的一部分被引入,以便能夠和 TCP 等網絡流和文件流等進行交互。
現(xiàn)在 TypedArray 已經被添加到了 ES6 中,Buffer 類以一種更優(yōu)化和適用于 NodeJS 操作的方式實現(xiàn)了 Unit8Array API。
總而言之,Buffer 類是用來處理二進制數(shù)據(jù),因為太常用了,所以直接放在了全局變量里,使用的時候無需 require。
Buffer 類的實例類似于整型數(shù)組,不過緩沖區(qū)的大小在創(chuàng)建時確定,不能調整。Buffer 對象不同之處在于它不經 V8 的內存分配機制,Buffer 是一個 JavaScript 和 C++ 結合的模塊,內存由 C++ 申請,JavaScript 分配。
關于 Buffer 內存分配相關知識不展開討論,感興趣同學可以看看樸老濕的書。
在 NodeJS v6 之前都是通過調用構造函數(shù)的方式實例化 Buffer,根據(jù)參數(shù)返回不同結果。處于安全性原因,這種方式在 v6 后的版本中已經被廢除,提供了
三個單獨的,職責清晰的函數(shù)處理實例化 Buffer 的工作。
// 0x 表示 16 進制 Buffer.from([1, 2, 3]) // [0x1, 0x2, 0x3] Buffer.from('test', 'utf-8') // [0x74, 0x65, 0x73, 0x74] Buffer.alloc(5, 1) // [0x1, 0x1, 0x1, 0x1, 0x1] Buffer.allocUnsafe(5); // 值不確定,后面詳談
Buffer.allocUnsafe()
的執(zhí)行會快于 Buffer.alloc()
看名字很不安全,確實也不安全。
當調用 Buffer.allocUnsafe()
時分配的內存段尚未初始化(不歸零),這樣分配內存速度很塊,但分配到的內存片段可能包含舊數(shù)據(jù)。如果在使用的時候不覆蓋這些舊數(shù)據(jù)就可能造成內存泄露,雖然速度快,盡量避免使用。
Buffer 支持以下幾種編碼格式
字符串轉為 Buffer 比較簡單
Buffer.from(string [, encoding])
同時 Buffer 實例也有 toString 方法將 Buffer 轉為字符串
buf.toString([encoding[, start[, end]]])
使用 concat 方法可以講多個 Buffer 實例拼接為一個 Buffer 實例
Buffer.concat(list[, totalLength])
在 NodeJS 中一個漢字由三個字節(jié)表示,如果我們處理中文字符的時候使用了不是3的倍數(shù)的字節(jié)數(shù)就會造成字符拼接亂碼問題。
const buf = Buffer.from('中文字符串!'); for(let i = 0; i < buf.length; i+=5){ var b = Buffer.allocUnsafe(5); buf.copy(b, 0, i); console.log(b.toString()); }
這樣可以看到結果中出現(xiàn)了亂碼
但如果使用 string_decoder 模塊便可以解決這個問題
const StringDecoder = require('string_decoder').StringDecoder; const decoder = new StringDecoder('utf8'); const buf = Buffer.from('中文字符串!'); for(let i = 0; i < buf.length; i+=5){ var b = Buffer.allocUnsafe(5); buf.copy(b, 0, i); console.log(decoder.write(b)); }
StringDecoder 在得到編碼后,知道寬字節(jié)在utf-8下占3個字節(jié),所以在處理末尾不全的字節(jié)時,會保留到第二次 write()。目前只能處理UTF-8、Base64 和 UCS-2/UTF-16LE。
還有一些 Buffer 常用的 API
感謝你能夠認真閱讀完這篇文章,希望小編分享NodeJS中的Buffer有什么用內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。