欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

NodeJS中的Buffer有什么用

這篇文章主要介紹了NodeJS中的Buffer有什么用,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

為臨縣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及臨縣網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、臨縣網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

什么是 Buffer

如同官方 API 中介紹的那樣,在 ES6 引入 TypedArray 之前,JavaScript 沒有讀取或者操作二進制數(shù)據(jù)流的機制。 Buffer 類作為 NodeJS API 的一部分被引入,以便能夠和 TCP 等網(wǎng)絡(luò)流和文件流等進行交互。

現(xiàn)在 TypedArray 已經(jīng)被添加到了 ES6 中,Buffer 類以一種更優(yōu)化和適用于 NodeJS 操作的方式實現(xiàn)了 Unit8Array API。

總而言之,Buffer 類是用來處理二進制數(shù)據(jù),因為太常用了,所以直接放在了全局變量里,使用的時候無需 require。

Buffer 類的實例類似于整型數(shù)組,不過緩沖區(qū)的大小在創(chuàng)建時確定,不能調(diào)整。Buffer 對象不同之處在于它不經(jīng) V8 的內(nèi)存分配機制,Buffer 是一個 JavaScript 和 C++ 結(jié)合的模塊,內(nèi)存由 C++ 申請,JavaScript 分配。

關(guān)于 Buffer 內(nèi)存分配相關(guān)知識不展開討論,感興趣同學(xué)可以看看樸老濕的書。

實例化 Buffer

在 NodeJS v6 之前都是通過調(diào)用構(gòu)造函數(shù)的方式實例化 Buffer,根據(jù)參數(shù)返回不同結(jié)果。處于安全性原因,這種方式在 v6 后的版本中已經(jīng)被廢除,提供了

  • Buffer.from()
  • Buffer.alloc()
  • Buffer.allocUnsafe()

三個單獨的,職責(zé)清晰的函數(shù)處理實例化 Buffer 的工作。

  • Buffer.from(array):返回一個內(nèi)容包含所提供的字節(jié)副本的 Buffer,數(shù)組中每一項是一個表示八位字節(jié)的數(shù)字,所以值必須在 0 ~ 255 之間,否則會取模
  • Buffer.from(arrayBuffer):返回一個與給定的 ArrayBuffer 共享內(nèi)存的新 Buffer
  • Buffer.from(buffer):返回給定 Buffer 的一個副本 Buffer
  • Buffer.from(string [, encoding]):返回一個包含給定字符串的 Buffer
  • Buffer.alloc(size [, fill [, encoding]]):返回指定大小并且“已填充”的 Buffer
  • Buffer.allocUnsafe(size):返回指定大小的 Buffer,內(nèi)容必須用 buf.fill(0) 等方法填充
// 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() 看名字很不安全,確實也不安全。

當(dāng)調(diào)用 Buffer.allocUnsafe() 時分配的內(nèi)存段尚未初始化(不歸零),這樣分配內(nèi)存速度很塊,但分配到的內(nèi)存片段可能包含舊數(shù)據(jù)。如果在使用的時候不覆蓋這些舊數(shù)據(jù)就可能造成內(nèi)存泄露,雖然速度快,盡量避免使用。

編碼

Buffer 支持以下幾種編碼格式

  • ascii
  • utf8
  • utf16le
  • base64
  • binary
  • hex

Buffer 和 String 轉(zhuǎn)換

字符串轉(zhuǎn)為 Buffer 比較簡單

Buffer.from(string [, encoding])

同時 Buffer 實例也有 toString 方法將 Buffer 轉(zhuǎn)為字符串

buf.toString([encoding[, start[, end]]])

Buffer 拼接

使用 concat 方法可以講多個 Buffer 實例拼接為一個 Buffer 實例

Buffer.concat(list[, totalLength])

StringDecoder

在 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());
}

這樣可以看到結(jié)果中出現(xiàn)了亂碼

NodeJS中的Buffer有什么用

但如果使用 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

還有一些 Buffer 常用的 API

  • Buffer.isBuffer:判斷對象是否為 Buffer
  • Buffer.isEncoding:判斷 Buffer 對象編碼
  • buf.length:返回 內(nèi)存為此 Buffer 實例所申請的字節(jié)數(shù),并不是 Buffer 實例內(nèi)容的字節(jié)數(shù)
  • buf.indexOf:和數(shù)組的 indexOf 類似,返回某字符串、acsii 碼或者 buf 在改 buf 中的位置
  • buf.copy:將一個 buf 的(部分)內(nèi)容復(fù)制到另外一個 buf 中

感謝你能夠認真閱讀完這篇文章,希望小編分享NodeJS中的Buffer有什么用內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細的解決方法等著你來學(xué)習(xí)!

當(dāng)前標題:NodeJS中的Buffer有什么用
文章起源:http://www.chinadenli.net/article22/iigicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站定制網(wǎng)站手機網(wǎng)站建設(shè)做網(wǎng)站云服務(wù)器響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化