Node.jsのバイナリBufferをJavaScriptのArrayBufferに変換する方法
Node.jsのBufferをArrayBufferに変換する基本
Node.jsでファイルやネットワーク通信などを通じて取得したバイナリデータは、通常 Buffer オブジェクトとして扱われます。一方、ブラウザ側のJavaScriptやWeb APIでは ArrayBuffer が標準的なバイナリデータ形式です。両者を連携させるには、BufferからArrayBufferへの変換が必要になります。
最も手軽な方法は、Bufferインスタンスが持つ buf.buffer プロパティに直接アクセスすることです。このプロパティは、Bufferが内部で参照しているArrayBufferオブジェクトを返します。
なお、Node.js 4.x以降では、Bufferは Uint8Array のサブクラスとして実装されています。そのため、BufferのインスタンスはそのままTypedArrayとしても操作できる点も覚えておくと便利です。
注意点:buf.bufferはそのまま使えない場合がある
buf.buffer が返すArrayBufferは、必ずしもBufferの内容だけを格納しているとは限りません。Node.jsのBufferは内部のメモリプールから領域を確保するため、ArrayBuffer自体はBufferよりも大きく、データが途中のオフセット位置から始まっていることがあります。
確実に変換したい場合は、次のようにBufferの中身を新しいArrayBufferへコピーする方法が安全です。
変換用サンプルコード
function toArrayBuffer(myBuf) {
var myBuffer = new ArrayBuffer(myBuf.length);
var res = new Uint8Array(myBuffer);
for (var i = 0; i < myBuf.length; ++i) {
res[i] = myBuf[i];
}
return myBuffer;
}コードの解説
- new ArrayBuffer(myBuf.length): 元のBufferと同じバイト数の新しいArrayBufferを生成します。
- new Uint8Array(myBuffer): 作成したArrayBufferを8ビット符号なし整数の配列(Uint8Array)として扱えるようにします。
- forループ: Bufferの各バイトを1つずつUint8Array経由で新しいArrayBufferに書き込みます。
この関数の戻り値として得られるArrayBufferには、元のBufferのデータだけが正確に含まれているため、FileReader やWebSocketなど、ArrayBufferを前提としたAPIにも安心して渡せます。
別のアプローチ:slice()を使った部分抽出
コピー処理を自分で書きたくない場合は、Bufferが参照する内部ArrayBufferから必要な範囲だけを切り出す方法もあります。
const arrayBuffer = myBuf.buffer.slice( myBuf.byteOffset, myBuf.byteOffset + myBuf.length );
byteOffset と length を指定して slice() を呼び出すことで、Bufferの実データに対応する部分だけを持つ新しいArrayBufferを簡単に作成できます。
まとめ
Node.jsのBufferからJavaScriptのArrayBufferへの変換は、buf.buffer プロパティを起点に行います。ただし内部メモリプールの影響を考慮し、用途に応じて「全バイトをコピーする方法」か「slice() で必要な範囲を切り出す方法」を選択するのがポイントです。特に外部APIへデータを渡す場面では、コピーによる変換が最も安全です。
-
JavaScriptで配列をセット(Set)に変換する方法|new Set()の使い方を解説
JavaScriptでは、new Set() コンストラクタを使うことで、配列を簡単にセット(Setオブジェクト)へ変換できます。セットは同じ値を自動的に1つだけ保持する性質を持つため、配列から重複した要素を取り除きたい場合にも非常に便利です。 配列をセットに変換するサンプルコード 以下は、ボタンをクリックすると配列がセットに変換されて表示される、完全なHTMLサンプルです。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co
-
文字列をJavaScriptオブジェクトに変換する方法【JSON.parse()の使い方】
JavaScriptでJSON形式の文字列をオブジェクトに変換するには、JSON.parse()メソッドを使用します。このメソッドは、引数に渡された文字列を解析(パース)し、対応するJavaScriptオブジェクトを返します。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1.0 /> <title>Docum