NodeJS Buffer 理解

更新於 發佈於 閱讀時間約 7 分鐘

最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記

Buffer是什麼?

根據線上教學文檔解釋,JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。

但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buffer 類,該類用來創建一個專門存放二進制數據的緩存區。

而 Buffer 類提供一些使用方法,它允許你在Node.js 中直接操作二進制數據,而不需要像在瀏覽器中使用JavaScript時那樣使用字串。 Buffer類提供了一種在內存中存儲和操作二進制數據的方式,這對於處理文件、網絡數據、加密和解密等任務非常有用。

Buffer的應用

以下是Buffer的一些常見用途和特性:

1. 二進制數據儲存:你可以使用Buffer來存儲二進制數據,如文件內容、網絡數據、圖像、音頻等。

2. 數據轉換:Buffer可以輕鬆地將不同編碼的數據相互轉換,例如將字串轉換為二進制數據或將二進制數據轉換為字串。

3. 文件操作:Node.js的文件系統模塊(fs)通常使用Buffer來讀取和寫入文件內容,這是文件I/O操作的常見方式。

4. 網絡通信:Buffer在處理網絡數據時非常重要,它可以用於構建和解析HTTP請求、WebSocket數據等。

5. 加密和解密:許多加密算法(如AES、RSA等)操作的輸入和輸出數據通常是Buffer類型。

6. 性能優勢:與字串相比,Buffer在處理大量數據時通常具有更高的性能,因為它不需要解析字符編碼。

Buffer的內建方法函式

在NodeJS中提供了三種操作Buffer的函數,分別是Buffer.alloc()Buffer.allocUnsafeBuffer.from()

Buffer.alloc(size[, fill[, encoding]]): 返回一個指定大小的 Buffer 實例,如果沒有設置 fill,則默認填滿 0

以下是 Buffer.alloc 的基本用法:

let buf = Buffer.alloc(10);
console.log(buf);
raw-image

Buffer.allocUnsafe(size): 返回一個指定大小的 Buffer 實例,但是它不會被初始化,所以它可能包含敏感的數據。

而這裡創建 Buffer.allocUnsafe 速度執行會比 Buffer.alloc 快,主要是因為使用allocUnsafe 容易包含舊數據或是隨機的內容,故在使用時要確保洩漏敏感數據而導致不可預測的問題。

以下是 Buffer.allocUnsafe(size) 的基本用法:

const size = 10; 
const buffer = Buffer.allocUnsafe(size);
console.log(buffer);

Buffer.from()

而根據教學文檔來說,會較推薦使用Buffer.from()來創建。它允許你從不同的數據源創建 Buffer 對象。 Buffer.from() 方法通常用於將其他數據類型(如字串、陣列或 ArrayBuffer)轉換為 Buffer。這個方法提供了一種方便的方式來處理不同數據類型之間的轉換。

let buf_3 = Buffer.from('hello'); 
console.log(buf_3);

//run node.js 結果 ➜ nodeJs node hello.js
<Buffer 68 65 6c 6c 6f>

這每一個字母都會轉換為 unicode 碼表中對應的數字,然後再轉成二進制存到buffer中,亦可透過傳遞一個陣列方式轉成二進制存到buffer

let buf_4 = Buffer.from([104, 101, 108, 108, 111]); 
console.log(buf_4);

Buffer的操作跟字串轉換

當我們使用陣列方式傳遞,並透過toString()函式,就可以將陣列中的數字轉為原來的hello格式,而這裡的toString 默認是按照 utf-8 編碼方式進行轉換的

let buf_4 = Buffer.from([104, 101, 108, 108, 111]); 
console.log(buf_4.toString()); //默認使用 utf-8 的編碼方式

Buffer的讀寫

這邊我們可以透過陣列 []取值,來對 buffer做操作。

let buf = Buffer.from('hello');
//假設我們想獲取buffer 第一個h字母buffer保存的數據

console.log(buf[0]);

//會出現104,而這裡是一個十進制的表達方式
//然後我們對於這個104做二進制的轉換

let buf = Buffer.from('hello');
console.log(buf[0].toString(2)); //這個toString的用法與上面不同,最後應該是01101000

//會出現 1101000

//對裡頭單一字母進行修改
buf[0] = 95;
console.log(buf);

➜ nodeJs node hello.js
<Buffer 5f 65 6c 6c 6f>

//結果改完第一個字母會變成5f,之前是68

Buffer補充說明

溢出:主要原因是程序未能正確地驗證輸入數據的大小,導致數據超出了緩衝區的邊界而覆蓋了相鄰的內存區域。每個元素都是一個字節,而其值的範圍應該在0到255之間。

以下是一個範例,這邊我們將值設定為361,而 buffer 二進制位能儲存的最大十進制數字為 255 而這種情況在執行時,系統會捨棄高於八進制的數字


let buf = Buffer.from('hello');
buf[0] = 361;

console.log(buf);

現在他變成69 ➜ nodeJs node hello.js
<Buffer 69 65 6c 6c 6f>

十進制 361 變成二進制為 0001 0110 1001,而當寫入時只寫入 0110 1001,透過console.log(buf); 現在他變成69

來看一下小工具執行的圖,這邊輸入十進位361,得出二進位0001 0110 1001

raw-image

接著我們捨棄高於八進制的數字,只輸入 0110 1001,利用工具二進位得輸入110 1001,這可以看到八進位結果為69,與程式碼console.log(buf)結果一致。

raw-image

以上是對學習NodeJs Buffer的理解跟用法,相關參考文件跟資料整理下方

https://www.runoob.com/nodejs/nodejs-buffer.html

軟體為ASCII Converter





avatar-img
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在 JavaScript 中,字串(String)是一個不可變的原生資料型態,用來存放並處理文字。JavaScript 提供多種方法和屬性來操作和格式化字串。理解這些屬性與方法,能讓我們更靈活地處理文字資料,特別是在處理用戶輸入、顯示訊息或處理 API 回傳的資料時非常有用。
Thumbnail
Node.js 是一個功能強大的 JavaScript 執行環境,它內建的核心模組讓開發者能夠輕鬆處理檔案系統操作、網路請求和路徑管理等常見需求。本文將介紹三個常用的 Node.js 核心模組,並透過範例程式碼展示它們的基本用法,幫助你快速上手。
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
我們在「【🎓 Python的深度問答集】torchaudio 對部分段落進行音訊解碼」有分享到如何對一包包的封包進行音訊解碼, 但隨著音檔越大, 最終解碼的速度會越來越慢, 而這並非串流的本意, 串流應該就像水管一樣, 收到多少資料就運算多少量, 並不會隨著累積的容量越大而導致效能下降。 但實際
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在 JavaScript 中,字串(String)是一個不可變的原生資料型態,用來存放並處理文字。JavaScript 提供多種方法和屬性來操作和格式化字串。理解這些屬性與方法,能讓我們更靈活地處理文字資料,特別是在處理用戶輸入、顯示訊息或處理 API 回傳的資料時非常有用。
Thumbnail
Node.js 是一個功能強大的 JavaScript 執行環境,它內建的核心模組讓開發者能夠輕鬆處理檔案系統操作、網路請求和路徑管理等常見需求。本文將介紹三個常用的 Node.js 核心模組,並透過範例程式碼展示它們的基本用法,幫助你快速上手。
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
我們在「【🎓 Python的深度問答集】torchaudio 對部分段落進行音訊解碼」有分享到如何對一包包的封包進行音訊解碼, 但隨著音檔越大, 最終解碼的速度會越來越慢, 而這並非串流的本意, 串流應該就像水管一樣, 收到多少資料就運算多少量, 並不會隨著累積的容量越大而導致效能下降。 但實際
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。