1. ホーム
  2. node.js

[解決済み] node.jsでバイナリデータをバッファに追記する方法

2023-02-11 11:03:22

質問

バイナリデータを格納したバッファがあります。

var b = new Buffer ([0x00, 0x01, 0x02]);

を追加し、さらに 0x03 .

バイナリデータをさらに追加するにはどうしたらよいでしょうか?ドキュメントを検索していますが、データを追加するためには文字列でなければならず、そうでない場合はエラーが発生します( TypeErrorです。引数は文字列でなければなりません ):

var b = new Buffer (256);
b.write ("hola");
console.log (b.toString ("utf8", 0, 4)); //hola
b.write (", adios", 4);
console.log (b.toString ("utf8", 0, 11)); //hola, adios

それから、私がここで見ることのできる唯一の解決策は、追加されたバイナリデータごとに新しいバッファを作成し、正しいオフセットでメジャーバッファにコピーすることです。

var b = new Buffer (4); //4 for having a nice printed buffer, but the size will be 16KB
new Buffer ([0x00, 0x01, 0x02]).copy (b);
console.log (b); //<Buffer 00 01 02 00>
new Buffer ([0x03]).copy (b, 3);
console.log (b); //<Buffer 00 01 02 03>

しかし、これは少し非効率的に思えます。なぜなら、追記するたびに新しいバッファをインスタンス化しなければならないからです。

バイナリデータを追加するためのより良い方法をご存知ですか?

EDIT

を書きました。 バッファードライター を書き、内部バッファを使用してファイルにバイトを書き込みます。と同じです。 バッファードリーダ と同じですが、書き込み用です。

簡単な例です。

//The BufferedWriter truncates the file because append == false
new BufferedWriter ("file")
    .on ("error", function (error){
        console.log (error);
    })

    //From the beginning of the file:
    .write ([0x00, 0x01, 0x02], 0, 3) //Writes 0x00, 0x01, 0x02
    .write (new Buffer ([0x03, 0x04]), 1, 1) //Writes 0x04
    .write (0x05) //Writes 0x05
    .close (); //Closes the writer. A flush is implicitly done.

//The BufferedWriter appends content to the end of the file because append == true
new BufferedWriter ("file", true)
    .on ("error", function (error){
        console.log (error);
    })

    //From the end of the file:
    .write (0xFF) //Writes 0xFF
    .close (); //Closes the writer. A flush is implicitly done.

//The file contains: 0x00, 0x01, 0x02, 0x04, 0x05, 0xFF

最終更新日

使用方法 連結 .

どのように解決するのですか?

Node.jsの回答を更新しました ~>0.8

Nodeは以下のことが可能です。 バッファを連結する を自分自身で実行できるようになりました。

var newBuffer = Buffer.concat([buffer1, buffer2]);

Node.js ~0.6 に対する古い回答

私はモジュールを使用して .concat 関数などを追加しています。

https://github.com/coolaj86/node-bufferjs

私はこれが純粋なソリューションでないことを知っていますが、私の目的には非常によく機能します。