首頁  >  文章  >  web前端  >  buffer是什麼?深入了解Nodejs中的buffer模組

buffer是什麼?深入了解Nodejs中的buffer模組

青灯夜游
青灯夜游轉載
2021-12-30 19:21:162977瀏覽

buffer是什麼?以下這篇文章帶大家深入了解一下Nodejs中的buffer模組,介紹一下創建、複製、拼接、截取、填充Buffer,以及Buffer與String相互轉換的方法,希望對大家有幫助!

buffer是什麼?深入了解Nodejs中的buffer模組

1.buffer是什麼?

我們知道,JS在對字串、陣列、數字、布林值等都有對應的方法API進行操作處理,而在Node中,還需要檔案操作、網路通訊、操作資料庫、資料傳輸等能力;文件在儲存層面都是以二進位形式表示,在http的請求和回應中資料的傳輸也是以二進位資料進行傳輸,所以僅僅目前的JS能力還是不夠的,也就在Node中提供了buffer模組。

即:使得NodeJS擁有像操作字串一樣來操作處理二進位資料的能力。 buffer也被稱為臨時性暫存區,即暫時存放輸入和輸出二進位資料的一段記憶體。

在之前的文章聊聊Nodejs中的核心模組:stream流模組(看看如何使用)中,我們了解到在對大檔案進行讀取操作時候,一般不會一次全部讀取到記憶體中,而是以流的形式讀取一段資料塊,而連續的資料塊便形成了資料流的概念。而在對資料區塊讀取和寫入過程中,資料首先會儲存在buffer(臨時性暫存區)的記憶體中,以待處理。

1.1 了解buffer記憶體分配

#buffer物件的記憶體分配並不是在V8的堆記憶體中,而是在Node的C 層面實現內存的申請;為了高效的使用申請來得內存,Node中採用slab分配機制(一種動態內存管理機制)。

1. 2 buffer的全局性

Node在進程啟動時buffer就已經加裝進入內存,並將其放入全局對象,使用時候可以無需require引入,但是官方但仍然建議透過import 或require 語句明確地引用它。

2. 建立Buffer

buffer實例除了可以在檔案讀取,http請求得到之外,還可以透過手動方式建構建立。

2.1 Buffer.alloc(size[, fill[, encoding]])

參數:

  • # size: buffer長度
  • fill: 預先填入值,預設值:0
  • encoding: 如果fill是字串,則就是字串的編碼,預設:utf-8
#
import { Buffer } from 'buffer';

const buf = Buffer.alloc(8);

console.log(buf);
// <Buffer 00 00 00 00 00 00 00 00>

2.2 Buffer.allocUnsafe(size)

參數:

  • size: 新的buffer所需長度
  • 以這種方式建立的 Buffer 實例的底層記憶體不會被初始化。新建立的 Buffer 的內容是未知的,可能包含敏感的資料。
import { Buffer } from &#39;buffer&#39;;

const buf = Buffer.allocUnsafe(8);

console.log(buf);
// <Buffer e8 bf 99 e6 98 af e4 b8 80 e6>

2.3 Buffer.from(string[, encoding])

建立包含傳入string的新buffer

參數:

  • string: 字串
  • encoding: 編碼,預設值:utf-8
import { Buffer } from &#39;buffer&#39;;

const buf = Buffer.from(&#39;hello buffer&#39;);

console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

2.4 Buffer.from(array)

使用 0 – 255 範圍內的位元組 array 指派新的Buffer

import { Buffer } from &#39;buffer&#39;;

const array = [0x62, 0x78, 0x84];
const buf = Buffer.from(array);

console.log(buf);
// <Buffer 62 78 84>

3. 複製Buffer

#3.1 Buffer.from(buffer)

#參數:

  • buffer,要複製的buffer實例
import { Buffer } from &#39;buffer&#39;;
// 新建
const buf1 = Buffer.alloc(10, 2);
// 复制
const buf2 = Buffer.from(buf1);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 02 02 02 02 02 02 02 02 02 02>

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

將buf實例複製到target目標

import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(10, 2);
const buf2 = Buffer.allocUnsafe(10)
// 将buf1复制到buf2
buf1.copy(buf2);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 02 02 02 02 02 02 02 02 02 02>

4. 拼接Buffer

##4.1 Buffer.concat(list[, totalLength])

傳回list中所有buffer實例連接在一起的新buffer

參數:

    #list:ce1f03efdfa3a50760234dcf9b3662a8 | 2352a1ddeafcbb075c98dd9a641f874c
  • totalLength: 連接總長度。

注意

    如果清單沒有條目,或 totalLength 為 0,則傳回新的零長度 Buffer。
  • 如果未提供 totalLength,則從 list 中的 Buffer 實例透過相加其長度來計算。
  • import { Buffer } from &#39;buffer&#39;;
    
    const buf1 = Buffer.alloc(4, 2);
    const buf2 = Buffer.alloc(4, 3);
    
    const buf3 = Buffer.concat([buf1, buf2]);
    
    console.log(buf1); // <Buffer 02 02 02 02>
    console.log(buf2); // <Buffer 03 03 03 03>
    console.log(buf3); // <Buffer 02 02 02 02 03 03 03 03>

5. 截取Buffer

#5.1 buf.slice([start[, end]])

從buf實例傳回新的Buffer實例,傳回的新Buffer實例只是來源buf實例的引用,也就是對新傳回的實例修改會影響原有的Buffer實例

參數:

  • start: 起始位置,默认0
  • end: 结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(10, 2);
// 截取
const buf2 = buf1.slice(1,4);
// 截取部分修改
buf2[0] = 0x63;

console.log(buf1);
// <Buffer 02 63 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 63 02 02>

6. 填充Buffer

6.1 buf.fill(value[, offset[, end]][, encoding])

参数:

  • value,填充值
  • offset: 在开始填充 buf 之前要跳过的字节数,默认值0
  • end: 结束填充buf(不包括在内)的位置,默认值buf.length
  • encoding,如果value值为字符串,则为字符串编码,默认utf-8
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(8).fill(2);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02>

6.2 buf.write(string[, offset[, length]][, encoding])

根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。

注意:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分

参数:

  • string: 写入的字符串值
  • offset: 开始写入 string 之前要跳过的字节数,默认值为0
  • length: 写入的最大字节数,默认值buf.length - offset
  • encoding: 编码,默认utf-8
import { Buffer } from &#39;buffer&#39;;
// buf1 length为12
const buf1 = Buffer.alloc(12, 3);
// write offset大于buf1.length,写入无效
buf1.write(&#39;hello&#39;, 12);

console.log(buf1);
// <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
// 部分写入
buf1.write(&#39;hello&#39;, 10);
// <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>

7. Buffer工具方法

7.1 Buffer.isBuffer(obj)

检验传入obj是否为buffer

import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(12, 3);

console.log(Buffer.isBuffer(buf1));
// true

7.2 Buffer.isEncoding(encoding)

检查传入的编码名称是否被Buffer所支持

import { Buffer } from &#39;buffer&#39;;

console.log(Buffer.isEncoding(&#39;utf-8&#39;))
// true

8. Buffer与String的转换

Buffer转String

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

参数:

  • encoding:使用的字符串编码,默认utf-8
  • start,开始位置,默认0
  • end,结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(26)

for (let i = 0; i < 26; i++) {
  // 97 是 &#39;a&#39; 的十进制 ASCII 值。
  buf1[i] = i + 97;
}

console.log(buf1.toString())
// abcdefghijklmnopqrstuvwxyz

String转Buffer

8.2 Buffer.from(string[, encoding])

参数:

  • string: 字符串
  • encoding: 编码,默认值:utf-8
import { Buffer } from &#39;buffer&#39;;

const buf = Buffer.from(&#39;hello buffer&#39;);

console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

9. Buffer与Array的对比

9.1 与Array类似点

  • 可以使用下标获取指定位置的值
  • 可以使用length属性获取Buffer大小
  • 可以使用for...of遍历

9.2 与Array不同之处

  • 存储的是16进制的两位数
  • 值为0-255
  • 支持多种编码格式
  • 内存不在v8堆中分配
  • 底层有c++实现,上层由js控制

更多node相关知识,请访问:nodejs 教程!!

以上是buffer是什麼?深入了解Nodejs中的buffer模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除