8、Node.js Buffer(緩衝區)

来源:https://www.cnblogs.com/-nbloser/archive/2018/06/03/9131245.html
-Advertisement-
Play Games

內容:Buffer與字元編碼,Buffer創建、寫入、讀取、轉換成JSON對象、合併、比較、拷貝、裁剪、長度 Buffer 與字元編碼Buffer 實例一般用於表示編碼字元的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六進位編碼的數據。 通過使用顯式的字元編碼,就可以在 Buffe ...


內容:Buffer與字元編碼,Buffer創建、寫入、讀取、轉換成JSON對象、合併、比較、拷貝、裁剪、長度

 

Buffer 與字元編碼
Buffer 實例一般用於表示編碼字元的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六進位編碼的數據。 通過使用顯式的字元編碼,就可以在 Buffer 實例與普通的 JavaScript 字元串之間進行相互轉換。

const buf = Buffer.from('runoob', 'ascii');
// 輸出 72756e6f6f62
console.log(buf.toString('hex'));
// 輸出 cnVub29i
console.log(buf.toString('base64'));

 

##############################################################################################
創建 Buffer 類
Buffer 提供了以下 API 來創建 Buffer 類:
    • Buffer.alloc(size[, fill[, encoding]]): 返回一個指定大小的 Buffer 實例,如果沒有設置 fill,則預設填滿 0
    • Buffer.allocUnsafe(size): 返回一個指定大小的 Buffer 實例,但是它不會被初始化,所以它可能包含敏感的數據
    • Buffer.allocUnsafeSlow(size)
    • Buffer.from(array): 返回一個被 array 的值初始化的新的 Buffer 實例(傳入的 array 的元素只能是數字,不然就會自動被 0 覆蓋)
    • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一個新建的與給定的 ArrayBuffer 共用同一記憶體的 Buffer。
    • Buffer.from(buffer): 複製傳入的 Buffer 實例的數據,並返回一個新的 Buffer 實例
    • Buffer.from(string[, encoding]): 返回一個被 string 的值初始化的新的 Buffer 實例

// 創建一個長度為 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 創建一個長度為 10、且用 0x1 填充的 Buffer。 
const buf2 = Buffer.alloc(10, 1);
// 創建一個長度為 10、且未初始化的 Buffer。
// 這個方法比調用 Buffer.alloc() 更快,
// 但返回的 Buffer 實例可能包含舊數據,
// 因此需要使用 fill() 或 write() 重寫。
const buf3 = Buffer.allocUnsafe(10);
// 創建一個包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
// 創建一個包含 UTF-8 位元組 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
// 創建一個包含 Latin-1 位元組 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');

 

 

############################################################################################
寫入緩衝區
###語法
寫入 Node 緩衝區的語法如下所示:
buf.write(string[, offset[, length]][, encoding])
###參數
參數描述如下:
    • string - 寫入緩衝區的字元串。
    • offset - 緩衝區開始寫入的索引值,預設為 0 。
    • length - 寫入的位元組數,預設為 buffer.length
    • encoding - 使用的編碼。預設為 'utf8' 。
根據 encoding 的字元編碼寫入 string 到 buf 中的 offset 位置。 length 參數是寫入的位元組數。 如果 buf 沒有足夠的空間保存整個字元串,則只會寫入 string 的一部分。 只部分解碼的字元不會被寫入。
###返回值
返回實際寫入的大小。如果 buffer 空間不足, 則只會寫入部分字元串。
###實例

buf = Buffer.alloc(256);
len = buf.write("love A");
console.log("寫入位元組數 : "+  len);

執行以上代碼,輸出結果為:
寫入位元組數 : 14

 

#############################################################################################
從緩衝區讀取數據
###語法
讀取 Node 緩衝區數據的語法如下所示:
buf.toString([encoding[, start[, end]]])
###參數
參數描述如下:
    • encoding - 使用的編碼。預設為 'utf8' 。
    • start - 指定開始讀取的索引位置,預設為 0。
    • end - 結束位置,預設為緩衝區的末尾。
###返回值
解碼緩衝區數據並使用指定的編碼返回字元串。
###實例

buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}
console.log( buf.toString('ascii'));       // 輸出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // 輸出: abcde
console.log( buf.toString('utf8',0,5));    // 輸出: abcde
console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 編碼, 並輸出: abcde

執行以上代碼,輸出結果為:
abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

 

#############################################################################################
將 Buffer 轉換為 JSON 對象
###語法
將 Node Buffer 轉換為 JSON 對象的函數語法格式如下:
buf.toJSON()
當字元串化一個 Buffer 實例時,JSON.stringify() 會隱式地調用該 toJSON()。
###返回值
返回 JSON 對象。
##實例

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
console.log(buf);
// 輸出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);
const copy = JSON.parse(json, (key, value) => {
  return value && value.type === 'Buffer' ? Buffer.from(value.data) : value;
});
// 輸出: <Buffer 01 02 03 04 05>
console.log(copy);

執行以上代碼,輸出結果為:
<Buffer 01 02 03 04 05>
{"type":"Buffer","data":[1,2,3,4,5]}
<Buffer 01 02 03 04 05>

 

##############################################################################################
緩衝區合併
###語法
Node 緩衝區合併的語法如下所示:
Buffer.concat(list[, totalLength])
###參數
參數描述如下:
    • list - 用於合併的 Buffer 對象數組列表。
    • totalLength - 指定合併後Buffer對象的總長度。
###返回值
返回一個多個成員合併的新 Buffer 對象。
###實例

var buffer1 = Buffer.from(('Love'));
var buffer2 = Buffer.from(('A'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 內容: " + buffer3.toString());

執行以上代碼,輸出結果為:
buffer3 內容: Love A

##############################################################################################
緩衝區比較
###語法
buf.compare(otherBuffer);
###參數
    • otherBuffer - 與 buf 對象比較的另外一個 Buffer 對象。
###返回值
返回一個數字,表示 buf 在 otherBuffer 之前,之後或相同。
###實例

var buf1 = Buffer.from('zabc');
var buf2 = Buffer.from('xq');
var result = buf1.compare(buf2);

if(result < 0){
    console.log(buf1.toString()+'在'+buf2.toString()+'之前');
}else if (result === 0){
    console.log(buf1.toString()+'與'+buf2.toString()+'相同');
}else {
    console.log(buf1.toString()+'在'+buf2.toString()+'之後');
}

執行以上代碼,輸出結果為:
zabc在xq之後

 

##########################################################################################
拷貝緩衝區
###語法
Node 緩衝區拷貝語法如下所示:
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
###參數
參數描述如下:
    • targetBuffer - 要拷貝的 Buffer 對象。
    • targetStart - 數字, 可選, 預設: 0
    • sourceStart - 數字, 可選, 預設: 0
    • sourceEnd - 數字, 可選, 預設: buffer.length
###返回值
沒有返回值。
###實例

var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//將 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
console.log(buf1.toString());

執行以上代碼,輸出結果為:
abRUNOOBijkl

###########################################################################################
緩衝區裁剪
Node 緩衝區裁剪語法如下所示:
buf.slice([start[, end]])
###參數
    • start - 數字, 可選, 預設: 0
    • end - 數字, 可選, 預設: buffer.length
###返回值
返回一個新的緩衝區,它和舊緩衝區指向同一塊記憶體,但是從索引 start 到 end 的位置剪切。
###實例

var buffer1 = Buffer.from('runoob');
// 剪切緩衝區
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

執行以上代碼,輸出結果為:
buffer2 content: ru

 

##########################################################################################
緩衝區長度
語法
Node 緩衝區長度計算語法如下所示:
buf.length;
返回值
返回 Buffer 對象所占據的記憶體長度。
實例

var buffer = Buffer.from('www.XXXXXXX.com');
//  緩衝區長度
console.log("buffer length: " + buffer.length);



 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、實驗素材: 附加學生信息表(student) 二、實驗要求: 1、 查詢student表中所有學生的信息 select * from student 2、 查詢student表中“姓名”“所在班級”和“成績”列內容 select 姓名,所在班級,成績 from student 3、 查詢stud ...
  • 當需要將一臺機器(源機器)上的一個資料庫完全複製到另一臺機器(目標機器)上時,可以選擇先在源機器上備份該資料庫,然後在目標機器上還原該備份的方法。 下麵詳細描述具體步驟: 1. 打開SQL server management studio 2. 連接到伺服器。在“伺服器名稱”上填寫本機名稱,可以在計 ...
  • last night,i've tested flashback by MyFlash tool,but failed,now let's do some other test with it.first of all,clear the test environment:drop the proc ...
  • 最近做了一個關於相冊的小App,需要對安卓手機的存儲設備進行讀取,首先需要獲取系統讀寫許可權,在網上一頓好找,對於老手來說,可能很容易,對於菜鳥來說,就有點困難了,為了容易學習,特把自己寫的一些心得寫下,用以參考。如有不當之處,歡迎指正。 首先做一個關於手機內部存儲和外部存儲之間的介紹: 對內部存儲設 ...
  • 1、標準廣播:是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎會在同一時刻接收到這條廣播信息,它們之間沒有先後順序。效率高、無法被截斷。 2、有序廣播:是一種同步執行的廣播,在廣播發出後,同一時刻只會有一個廣播接收器能夠接收到這條廣播,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳 ...
  • //1.var定義的變數可以修改,如果不初始化會輸出undefined,不會報錯。 var a; console.log(a); //undefined //2.let是塊級作用域,函數內部使用let定義後,對函數外部無影響。 let c = 3; console.log(c) function c... ...
  • 可參考 http://blog.pandax.me/cjbk/ 此文 ...
  • 通過對img opacity樣式的修改,達到對img顯隱的控制,從而形成輪播 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...