亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

Node.js Buffer用法解讀

2024-05-06 16:44:30
字體:
來源:轉載
供稿:網友

Buffer是什么?

Buffer作為存在于全局對象上,無需引入模塊即可使用,你絕對不可以忽略它。

可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。

Buffer的應用場景有哪些?

怎么理解流呢?流是數據的集合(與數據、字符串類似),但是流的數據不能一次性獲取到,數據也不會全部load到內存中,因此流非常適合大數據處理以及斷斷續續返回chunk的外部源。流的生產者與消費者之間的速度通常是不一致的,因此需要buffer來暫存一些數據。buffer大小通過highWaterMark參數指定,默認情況下是16Kb。

存儲需要占用大量內存的數據

Buffer 對象占用的內存空間是不計算在 Node.js 進程內存空間限制上的,所以可以用來存儲大對象,但是對象的大小還是有限制的。一般情況下32位系統大約是1G,64位系統大約是2G。

如何創建Buffer

除了流自動隱式創建Buffer之外,也可以手動創建Buffer,方式如下:

Buffer中存儲的數據已確定

Buffer.from(obj)  // obj支持的類型string, buffer, arrayBuffer, array, or array-like object

注意:Buffer.from不支持傳入數字,如下所示:

Buffer.from(1234);buffer.js:208  throw new errors.TypeError(  ^TypeError [ERR_INVALID_ARG_TYPE]: The "value" argument must not be of type number. Received type number  at Function.from (buffer.js:208:11)  ...

若要傳入數字可以采用傳入數組的方式:

const buf = Buffer.from([1, 2, 3, 4]);console.log(buf); // <Buffer 01 02 03 04>

但是這種方式存在一個問題,當存入不同的數值的時候buffer中記錄的二進制數據會相同,如下所示:

const buf2 = Buffer.from([127, -1]);console.log(buf2);   // <Buffer 7f ff>const buf3 = Buffer.from([127, 255]);console.log(buf3);  // <Buffer 7f ff>console.log(buf3.equals(buf2)); // true

當要記錄的一組數全部落在0到255(readUInt8來讀?。┻@個范圍, 或者全部落在-128到127(readInt8來讀取)這個范圍那么就沒有問題,否則的話就強烈不推薦使用Buffer.from來保存一組數。因為不同的數字讀取時應該調用不同的方法。

Buffer存儲數據未確定

Buffer.alloc、Buffer.allocUnsafe、Buffer.allocUnsafeSlow

Buffer.alloc會用0值填充已分配的內存,所以相比后兩者速度上要慢,但是也較為安全。當然也可以通過--zero-fill-buffers flag使allocUnsafe、allocUnsafeSlow在分配完內存后也進行0值填充。

node --zero-fill-buffers index.js

當分配的空間小于4KB的時候,allocUnsafe會直接從之前預分配的Buffer里面slice空間,因此速度比allocUnsafeSlow要快,當大于等于4KB的時候二者速度相差無異。

// 分配空間等于4KBfunction createBuffer(fn, size) { console.time('buf-' + fn); for (var i = 0; i < 100000; i++) {  Buffer[fn](size); } console.timeEnd('buf-' + fn);}createBuffer('alloc', 4096);createBuffer('allocUnsafe', 4096);createBuffer('allocUnsafeSlow', 4096);// 輸出buf-alloc:      294.002msbuf-allocUnsafe:   224.072msbuf-allocUnsafeSlow: 209.22ms
function createBuffer(fn, size) { console.time('buf-' + fn); for (var i = 0; i < 100000; i++) {  Buffer[fn](size); } console.timeEnd('buf-' + fn);}createBuffer('alloc', 4095);createBuffer('allocUnsafe', 4095);createBuffer('allocUnsafeSlow', 4095);// 輸出buf-alloc:      296.965msbuf-allocUnsafe:   135.877msbuf-allocUnsafeSlow: 205.225ms

需要謹記一點:new Buffer(xxxx) 方式已經不推薦使用了

Buffer使用

buffer轉字符串

const buf = Buffer.from('test');console.log(buf.toString('utf8'));         // testconsole.log(buf.toString('utf8', 0, 2));      // te

buffer轉json

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);console.log(buf.toJSON());  // { type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }

buffer裁剪,裁剪后返回的新的buffer與原buffer指向同一塊內存

buf.slice([start[, end]])
  1. start 起始位置
  2. end 結束位置(不包含)

示例:

var buf1 = Buffer.from('test');var buf2 = buf1.slice(1, 3).fill('xx');console.log("buf2 content: " + buf2.toString()); // xxconsole.log("buf1 content: " + buf1.toString()); // txxt

buffer拷貝,buffer與數組不同,buffer的長度一旦確定就不再變化,因此當拷貝的源buffer比目標buffer大時只會復制部分的值

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

示例:

var buf1 = Buffer.from('abcdefghijkl');var buf2 = Buffer.from('ABCDEF');buf1.copy(buf2, 1);console.log(buf2.toString()); //Abcdef

buffer相等判斷,比較的是二進制值

buf.equals(otherBuffer)

示例:

const buf1 = Buffer.from('ABC');const buf2 = Buffer.from('414243', 'hex'); console.log(buf1.equals(buf2));  // true

除了equals之外,compare其實也可以用于判斷是否相等(當結果為0則相等),不過compare更主要的作用是用于對數組內的buffer實例排序。

buffer是否包含特定值

buf.includes(value[, byteOffset][, encoding])buf.indexOf(value[, byteOffset][, encoding])

示例:

const buf = Buffer.from('this is a buffer');console.log(buf.includes('this')); // trueconsole.log(buf.indexOf('this')); // 0

寫入讀取數值

寫入方法:

位數固定且超過1個字節的: write{Double| Float | Int16 | Int32|  UInt16 | UInt32 }{BE|LE}(value, offset)

位數不固定的: write{Int | UInt}{BE | LE}(value, offset, bytelength) //此方法提供了更靈活的位數表示數據(比如3位、5位)

位數固定是1個字節的:     write{Int8 | Unit8}(value, offset)

讀取方法:

位數固定且超過1個字節的: read{Double| Float | Int16 | Int32 | UInt16 | UInt32 }{BE|LE}(offset)

位數不固定的:  read{Int | UInt}{BE | LE}(offset, byteLength)

位數固定是1個字節的: read{Int8 | Unit8}(offset)

Double、Float、Int16、Int32、UInt16、UInt32既確定了表征數字的位數,也確定了是否包含負數,因此定義了不同的數據范圍。同時由于表征數字的位數都超過8位,無法用一個字節來表示,因此就涉及到了計算機的字節序區分(大端字節序與小端字節序)

關于大端小端的區別可以這么理解:數值的高位在buffer的起始位置的是大端,數值的低位buffer的起始位置則是小端

const buf = Buffer.allocUnsafe(2);buf.writeInt16BE(256, 0) console.log(buf);      // <Buffer 01 00> buf.writeInt16LE(256, 0)console.log(buf);      // <Buffer 00 01>這里可以查看數值的不同進制之間的轉換,如果是大端的話,則直接按順序(0100)拼接16進制即可,如果是小端則需要調換一下順序才是正確的表示方式。

buffer合并

Buffer.concat(list[, totalLength]) //totalLength不是必須的,如果不提供的話會為了計算totalLength會多一次遍歷

const buf1 = Buffer.from('this is');const buf2 = Buffer.from(' funny');console.log(Buffer.concat([buf1, buf2], buf1.length + buf2.length));// <Buffer 74 68 69 73 20 69 73 20 66 75 6e 6e 79>

清空buffer

清空buffer數據最快的辦法是buffer.fill(0)

buffer模塊與Buffer的關系

Buffer是全局global上的一個引用,指向的其實是buffer.Buffer

 const buffer = require('buffer'); console.log(buffer.Buffer === Buffer); //true

buffer模塊上還有其他一些屬性和方法

const buffer = require('buffer');console.log(buffer);{ Buffer:  { [Function: Buffer]   poolSize: 8192,   from: [Function: from],   alloc: [Function: alloc],   allocUnsafe: [Function: allocUnsafe],   allocUnsafeSlow: [Function: allocUnsafeSlow],   isBuffer: [Function: isBuffer],   compare: [Function: compare],   isEncoding: [Function: isEncoding],   concat: [Function: concat],   byteLength: [Function: byteLength],   [Symbol(node.isEncoding)]: [Function: isEncoding] }, SlowBuffer: [Function: SlowBuffer], transcode: [Function: transcode], INSPECT_MAX_BYTES: 50, kMaxLength: 2147483647, kStringMaxLength: 1073741799, constants: { MAX_LENGTH: 2147483647, MAX_STRING_LENGTH: 1073741799 } }

上面的kMaxLength與MAX_LENGTH代表了新建buffer時內存大小的最大值,當超過限制值后就會報錯

32為機器上是(2^30)-1(~1GB)

64位機器上是(2^31)-1(~2GB)

Buffer釋放

我們無法手動對buffer實例進行GC,只能依靠V8來進行,我們唯一能做的就是解除對buffer實例的引用

參考資料

http://cenalulu.github.io/linux/character-encoding/
http://edu.vevb.com/nodejs/nodejs-buffer.html

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www国产精品com| www欧美xxxx| 亚洲一区二区三区毛片| 久久在线免费观看视频| 亚洲老司机av| 亚洲人a成www在线影院| www.日韩不卡电影av| 日韩有码在线播放| 久久免费精品日本久久中文字幕| 日本国产高清不卡| 欧美日韩美女在线观看| 国产高清在线不卡| 久久视频在线免费观看| 精品国产福利在线| 久久精品成人欧美大片古装| 久久久人成影片一区二区三区观看| 性视频1819p久久| www.亚洲人.com| 精品无人国产偷自产在线| 国产精品中文字幕在线观看| 欧美日韩亚洲国产一区| 精品国产网站地址| 国产精品老女人精品视频| 国产精品日韩精品| 久久久亚洲国产天美传媒修理工| 亚洲成人a**站| 国产在线视频欧美| 亚洲乱码国产乱码精品精天堂| 日本久久精品视频| 久久久综合av| 国产精品户外野外| 日韩在线视频二区| 亚洲激情视频网| 国产91免费看片| 国产午夜精品视频免费不卡69堂| 亚洲第一男人av| 成人美女免费网站视频| 日韩不卡在线观看| 亚洲色图五月天| 国产日韩中文在线| 成人网在线观看| 久久久综合免费视频| 狠狠操狠狠色综合网| 欧美日韩国内自拍| 国产精品偷伦视频免费观看国产| 亚洲日本中文字幕免费在线不卡| 青青在线视频一区二区三区| 96精品久久久久中文字幕| 欧美日本黄视频| 91精品国产色综合久久不卡98口| 欧美精品激情在线观看| 精品国产一区av| 国产suv精品一区二区三区88区| 欧美在线影院在线视频| 亚洲精品电影网| 中文字幕欧美日韩在线| 欧美在线视频播放| 992tv成人免费视频| 久久成人一区二区| 欧美黄色成人网| 日韩美女av在线| 午夜精品一区二区三区在线| 亚洲一区精品电影| 中文字幕亚洲图片| 中文字幕国产精品久久| 少妇久久久久久| 久久精品视频网站| 91午夜在线播放| 欧美精品aaa| 日韩视频免费观看| 国产日韩欧美夫妻视频在线观看| 国产日韩欧美中文| 精品五月天久久| 亚洲精品视频中文字幕| 国产视频丨精品|在线观看| 国语自产偷拍精品视频偷| 亚洲精品久久视频| 色综合天天综合网国产成人网| 黑丝美女久久久| 欧美极品欧美精品欧美视频| 91热福利电影| 97在线观看视频国产| 最新中文字幕亚洲| 国产亚洲a∨片在线观看| 自拍偷拍亚洲在线| 日韩电影免费在线观看| 亚洲精品美女久久久| 国产精品一区久久| 欧美多人乱p欧美4p久久| 亚洲xxx大片| 青草青草久热精品视频在线网站| 国产一区二区在线免费| 国产日韩欧美视频在线| 欧美夜福利tv在线| 亚洲人成欧美中文字幕| 国产视频999| 国产精品影院在线观看| 97av在线视频| 亚洲欧美国产精品专区久久| 日韩在线观看视频免费| 成人性生交xxxxx网站| 久热精品视频在线观看一区| 国产不卡精品视男人的天堂| 国产精品福利网站| 欧美一区二区三区艳史| 中文字幕国产精品久久| 日韩一区二区在线视频| 亚洲欧美在线磁力| 中文精品99久久国产香蕉| 精品久久久久久久久久ntr影视| 欧美成人精品h版在线观看| 国产亚洲一区精品| 国产精品伦子伦免费视频| 亚洲aaaaaa| 日韩欧美在线一区| 亚洲午夜精品久久久久久性色| 日本电影亚洲天堂| 国产精品白嫩美女在线观看| 亚洲美女视频网站| 亚洲性av网站| 国产热re99久久6国产精品| 秋霞成人午夜鲁丝一区二区三区| 日韩欧美中文字幕在线观看| 精品成人国产在线观看男人呻吟| 久久久久久久999| 亚洲男人天堂2024| 亚洲男女性事视频| 欧美日韩国产精品一区二区三区四区| 亚洲美女在线看| 欧美激情中文网| 国产99久久精品一区二区永久免费| 国产成人精品久久二区二区91| 91久久久久久久久久| 国产大片精品免费永久看nba| 国产一区二区三区高清在线观看| 欧美日韩福利在线观看| 97人人做人人爱| 成人中心免费视频| 欧美疯狂性受xxxxx另类| 精品日韩美女的视频高清| 国产做受高潮69| 午夜精品视频在线| 97视频网站入口| 日韩高清av一区二区三区| 日韩欧美亚洲综合| 日韩电影在线观看永久视频免费网站| 91视频8mav| 国产精品欧美日韩| 精品美女久久久久久免费| 国产欧美一区二区三区久久人妖| 成人精品久久av网站| 青青青国产精品一区二区| 午夜精品蜜臀一区二区三区免费| 最近2019中文免费高清视频观看www99| 亚洲欧美日韩网| 中文字幕国产亚洲| 亚洲精品久久7777777| 日本久久精品视频| 日韩成人激情在线| 久青草国产97香蕉在线视频| 久久久国产精品一区| 日韩在线观看你懂的| 中文字幕av一区二区三区谷原希美| 亚洲精品一区二区三区婷婷月|