JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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
);

byteOffsetlength を指定して slice() を呼び出すことで、Bufferの実データに対応する部分だけを持つ新しいArrayBufferを簡単に作成できます。

まとめ

Node.jsのBufferからJavaScriptのArrayBufferへの変換は、buf.buffer プロパティを起点に行います。ただし内部メモリプールの影響を考慮し、用途に応じて「全バイトをコピーする方法」か「slice() で必要な範囲を切り出す方法」を選択するのがポイントです。特に外部APIへデータを渡す場面では、コピーによる変換が最も安全です。

  1. JavaScriptで配列をセット(Set)に変換する方法|new Set()の使い方を解説

    JavaScriptでは、new Set() コンストラクタを使うことで、配列を簡単にセット(Setオブジェクト)へ変換できます。セットは同じ値を自動的に1つだけ保持する性質を持つため、配列から重複した要素を取り除きたい場合にも非常に便利です。 配列をセットに変換するサンプルコード 以下は、ボタンをクリックすると配列がセットに変換されて表示される、完全なHTMLサンプルです。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co

  2. 文字列を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