Node.js Buffer:處理二進位資料的基礎

在瀏覽器的 JavaScript 中,我們主要處理的是字串。但在伺服器端開發時,我們經常需要處理 二進位資料 (Binary Data),例如圖片上傳、壓縮檔、PDF 生成或網路封包交換。Node.js 的 Buffer 類別就是為了高效處理這些原始數據而設計的。

什麼是 Buffer?

Buffer 是在 V8 引擎 Heap 之外分配的一塊固定大小的記憶體區塊。在 JavaScript 中,它表現為一個類似陣列的物件,但其中的每個元素都是一個 位元組 (Byte),數值範圍從 0255(即十六進位的 00ff)。

從技術上講,Node.js 的 Buffer 是 JavaScript Uint8Array 的子類別,這意味著它具備更高的執行效能。

建立 Buffer 的三種主要方式

1. Buffer.alloc(size)

這是最推薦、最安全的方式。它會建立一個指定大小並自動「清零」的記憶體空間。

// 建立一個 10 Bytes 的 Buffer
const buf = Buffer.alloc(10);
console.log(buf); // <Buffer 00 00 00 00 00 00 00 00 00 00>

2. Buffer.from(data[, encoding])

根據現有的資料(如字串、陣列)建立 Buffer。

// 從字串建立 (預設為 utf-8)
const buf1 = Buffer.from('Hello');
console.log(buf1); // <Buffer 48 65 6c 6c 6f>

// 從陣列建立
const buf2 = Buffer.from([72, 105]);
console.log(buf2.toString()); // Hi

3. Buffer.allocUnsafe(size)

效能最快,因為它會直接截取記憶體空間而不進行初始化。這也意味著它可能包含之前的舊數據(殘留的敏感資訊)。

警告:除非你正處於極致效能優化的場景,且保證會立刻覆蓋整塊 Buffer,否則請一律使用 Buffer.alloc()

字串編碼與轉換

Buffer 最強大的功能之一是在不同的編碼格式之間進行轉換。Node.js 支援 utf8, ascii, base64, hex 等。

const buf = Buffer.from('Node.js教學', 'utf8');

// 轉換為 Base64 (常用於 API 圖片傳輸)
console.log(buf.toString('base64'));

// 轉換為 十六進位 (Hex) 常用於雜湊演算
console.log(buf.toString('hex'));

常用的 Buffer 操作

  • .length:獲取字節長度。注意:中文字「你」在 UTF-8 中佔 3 Bytes,所以 Buffer.from('你').length 是 3 而非 1。
  • Buffer.concat([buf1, buf2]):將多個 Buffer 片段合併成一個。這在接收網路傳輸的分段數據時非常有用。
  • .slice():切片(注意:這與陣列不同,它會共享同一塊內部記憶體)。
const b1 = Buffer.from('Hello ');
const b2 = Buffer.from('World');
const total = Buffer.concat([b1, b2]);
console.log(total.toString()); // Hello World

總結

  1. Buffer 是 Node.js 處理二進位資料的核心工具。
  2. 它是固定大小的,一旦建立後長度不可變。
  3. 理解 Buffer 對於後續學習「串流 (Stream)」與「檔案系統 (File System)」至關重要。