Node.jsにおけるBufferの役割と主要メソッド

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の利用シーン

  1. ファイルIO処理
const fs = require('fs');
const dataChunk = fs.readFileSync('image.jpg'); // Bufferを返す
  1. ネットワークパケット処理(TCP)
connection.on('data', (dataBuffer) => {
  console.log(dataBuffer); // Bufferオブジェクト
});
  1. エンコーディング変換(utf8/hex/base64)
let encoded = Buffer.from('world').toString('base64');
  1. バイナリプロトコル解析
dataBuffer.readUInt32BE(0);
  1. 画像、音声、暗号データの操作

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\*

タグ: nodejs Buffer binary-data javascript server-side-programming

7月6日 18:22 投稿