<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Node.js Buffer用法解讀

        來源:懂視網 責編:小采 時間:2020-11-27 22:14:24
        文檔

        Node.js Buffer用法解讀

        Node.js Buffer用法解讀:Buffer是什么? Buffer作為存在于全局對象上,無需引入模塊即可使用,你絕對不可以忽略它。 可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。 Buffer的應用場景有哪些? 流 怎么理解流呢?流是數據的集合(與
        推薦度:
        導讀Node.js Buffer用法解讀:Buffer是什么? Buffer作為存在于全局對象上,無需引入模塊即可使用,你絕對不可以忽略它。 可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。 Buffer的應用場景有哪些? 流 怎么理解流呢?流是數據的集合(與

        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的時候二者速度相差無異。

        // 分配空間等于4KB
        function 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.002ms buf-allocUnsafe: 224.072ms buf-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.965ms buf-allocUnsafe: 135.877ms buf-allocUnsafeSlow: 205.225ms

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

        Buffer使用

        buffer轉字符串

        const buf = Buffer.from('test');
        console.log(buf.toString('utf8')); // test
        console.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()); // xx
        console.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')); // true
        console.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>
        

        http://tools.jb51.net/transcoding/hexconvert這里可以查看數值的不同進制之間的轉換,如果是大端的話,則直接按順序(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/
        //www.gxlcms.com/article/31045.htm
        http://edu.jb51.net/nodejs/nodejs-buffer.html

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Node.js Buffer用法解讀

        Node.js Buffer用法解讀:Buffer是什么? Buffer作為存在于全局對象上,無需引入模塊即可使用,你絕對不可以忽略它。 可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。 Buffer的應用場景有哪些? 流 怎么理解流呢?流是數據的集合(與
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费夜色污私人影院网站| 中文字幕亚洲图片| 亚洲精品无码久久毛片波多野吉衣| 国产成人精品免费大全| 又黄又爽的视频免费看| 免费人成大片在线观看播放电影| 亚洲成片观看四虎永久| 色婷婷综合缴情综免费观看| 4338×亚洲全国最大色成网站| 三年在线观看免费观看完整版中文 | 最近更新免费中文字幕大全 | 亚洲精品视频观看| ww4545四虎永久免费地址| 先锋影音资源片午夜在线观看视频免费播放 | 内射无码专区久久亚洲| 一本久久A久久免费精品不卡| 亚洲精品无码久久久久sm| 亚洲成a人片在线不卡| 成年人在线免费观看| 黄网站色成年片大免费高清| 国产亚洲精aa成人网站| 真实国产乱子伦精品免费| 又大又粗又爽a级毛片免费看| jizz免费在线影视观看网站| 亚洲成AV人片在线播放无码| 国产a视频精品免费观看| 久久水蜜桃亚洲AV无码精品 | 成人在线免费观看| 一级一级毛片免费播放| 亚洲美女视频一区| 久久精品成人免费网站| 亚洲精品tv久久久久久久久久| 两个人看的www免费视频中文| 亚洲日韩在线视频| 日韩免费观看一区| 亚洲综合色婷婷七月丁香| 99精品视频在线观看免费播放| 亚洲国产成人99精品激情在线| 亚洲av高清在线观看一区二区 | 18禁成年无码免费网站无遮挡| 亚洲成人福利网站|