Node.js Bufferの機能・基本原理・主要メソッドを解説します。面接対策や実践開発に適した内容です。
Bufferの機能(最も重要な点)
Buffer = Node.jsのバイナリデータコンテナ(ヒープ外メモリ)
JavaScript(ブラウザ環境)は文字列のみサポートし、バイナリデータには対応していません。 Node.jsはサーバー環境であるため、以下の処理が必要になります:
- TCP/UDPバイナリパケットの処理
- ファイル操作(画像、動画、ZIP、音声ファイル)
- 画像、PDF、暗号化されたバイトストリーム
- バイナリプロトコル(protobufなど)
- Base64、Hex形式変換
- ネイティブ拡張(C++アドオン)との連携
このため、Node.js内部ではBufferが実装され、バイナリデータを処理しています。
特徴:
- ヒープ外メモリに保存(V8ヒープではない)、JavaScriptの制限を受けない
- 高パフォーマンス、IO操作に適している
Uint8Arrayを拡張したもの- 単位はバイト(0~255)
Bufferの利用シーン
- ファイルIO処理
const fs = require('fs');
const dataChunk = fs.readFileSync('image.jpg'); // Bufferを返す
- ネットワークパケット処理(TCP)
connection.on('data', (dataBuffer) => {
console.log(dataBuffer); // Bufferオブジェクト
});
- エンコーディング変換(utf8/hex/base64)
let encoded = Buffer.from('world').toString('base64');
- バイナリプロトコル解析
dataBuffer.readUInt32BE(0);
- 画像、音声、暗号データの操作
Bufferの主要メソッド(実用性重視)
開発で最も頻繁に使用される順に整理しています👇
Buffer生成
Buffer.from()
既存データからBufferを生成(最も一般的)。
Buffer.from('sample text'); // 文字列から
Buffer.from([0x41, 0x42, 0x43]); // バイト配列から
Buffer.from('73616d706c65', 'hex'); // 16進数から
Buffer.alloc(size)
指定サイズのBufferを生成(安全なゼロ埋め)。
Buffer.alloc(15);
Buffer.allocUnsafe(size)
高速だが安全でない(古いメモリを含む可能性あり)、パフォーマンス向上目的。
Buffer.allocUnsafe(15);
文字列の読み書き
読み取り
bufferData.toString('utf8');
bufferData.toString('hex');
bufferData.toString('base64');
書き込み
bufferData.write("sample", 0, "utf8");
バイト単位操作
個別バイトアクセス
console.log(bufferData[0]);
bufferData[2] = 128;
Buffer結合と分割
Buffer.concat()
複数のBufferを結合(ネットワークパケット結合でよく使用)
Buffer.concat([firstBuffer, secondBuffer]);
bufferData.slice(start, end)
分割(メモリ共有)
const segment = bufferData.slice(0, 8);
bufferData.copy()
別のメモリ領域にコピー(共有しない)
bufferData.copy(destination, 0, 0, 10);
埋め込み・判定・比較
埋め込み処理
bufferData.fill(0);
bufferData.fill(0xaa);
Buffer判定
Buffer.isBuffer(bufferData);
Buffer比較
firstBuffer.equals(secondBuffer);
ソート比較
Buffer.compare(firstBuffer, secondBuffer);
整数の読み書き(バイナリプロトコル処理の要)
整数書き込み
bufferData.writeUInt8(200, 0);
bufferData.writeUInt16BE(2000, 1);
bufferData.writeUInt32LE(100000, 3);
整数読み取り
bufferData.readUInt8(0);
bufferData.readUInt16BE(1);
bufferData.readUInt32LE(3);
ビッグエンディアン(BE)とリトルエンディアン(LE)はプロトコル設計によります。
主要ポイントまとめ(10項目)
| カテゴリ | 主なメソッド |
|---|---|
| 生成 | from, alloc, allocUnsafe |
| エンコード変換 | toString(utf8/hex/base64) |
| 書き込み | write |
| バイトアクセス | buffer\[index\] |
| 分割 | slice, subarray |
| 結合 | concat |
| コピー | copy |
| 判定 | isBuffer |
| 比較 | equals, compare |
| バイナリ処理 | writeUInt\*, readUInt\* |