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





15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
咦!奇怪, 怎麼網頁用一用就出現以下的畫面了, 到底是怎麼回事啊? 不用慌張, 讓我們仔細看看中間的「HTTP ERROR 431」,看到這樣的錯誤代碼, 相信心中隱約已經知曉我們的請求標頭內容太大了, 超過限制導致這樣的問題發生, 讓我們先詳細查閱這樣的錯誤訊息吧! 📚 https://
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
Thumbnail
由於Javascript本身設計就適合於單線程的應用, 但一般後端應用程式都會支援多個服務來處理client的請求, nodejs中也提供了cluster模組來達成此功能。 Cluster的原理很簡單,由於每個Process都只能用單核心的CPU來運行,那麼就多開幾個來幫忙處理吧! 而這個Clust
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
咦!奇怪, 怎麼網頁用一用就出現以下的畫面了, 到底是怎麼回事啊? 不用慌張, 讓我們仔細看看中間的「HTTP ERROR 431」,看到這樣的錯誤代碼, 相信心中隱約已經知曉我們的請求標頭內容太大了, 超過限制導致這樣的問題發生, 讓我們先詳細查閱這樣的錯誤訊息吧! 📚 https://
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
Thumbnail
由於Javascript本身設計就適合於單線程的應用, 但一般後端應用程式都會支援多個服務來處理client的請求, nodejs中也提供了cluster模組來達成此功能。 Cluster的原理很簡單,由於每個Process都只能用單核心的CPU來運行,那麼就多開幾個來幫忙處理吧! 而這個Clust