web-dev-qa-db-ja.com

JavaScriptオブジェクトをNode Bufferに変換する方法は?

ノードサーバーではBufferを、Javacriptクライアントでは Buffer を使用しています。

バイトを節約するために、JSONではなくバイナリとしてWebSocketを介してデータをサーバーに送信しようとしています。

だから、もし私が[ 5, false, 55, "asdf" ]、それを送信する直前にクライアントのバッファに変換したいと思います。多分このようなもの:

object.toBuffer('int16', 'bool', 'int16', 'utf8');

次のようなものをサーバーで読んでください:

var obj = buffer.read('int16', 'bool', 'int16', 'utf8');

私は現在の解決策を見ていますが、バイトオフセット/長さを指定したり、整数からブールに変換したりするなど、たくさんのconcatingを実行する必要があるようです。

もっと良い方法はありますか?

編集:これが私が現在あなたがしなければならないと思う方法です。私の問題は、冗長すぎてエラーが発生しやすいことだけだと思います。この操作はコードのさまざまな場所で実行されるため、より簡潔でエレガントな方法を探しています。

// On client for [ 5, false, 55, "test" ]

const writeFirst = Buffer.allocUnsafe(2);
writeFirst.writeInt16LE(5, 0);
const writeSecond = Buffer.allocUnsafe(1);
writeSecond.writeUInt8(0);
const writeThird = Buffer.allocUnsafe(2);
writeThird.writeInt16LE(55, 0);
const writeFourth = Buffer.from('test');

const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]);

// On server for reading buffer of [ 5, false, 55, "test" ]

const readFirst = result.readInt16LE(0);
const readSecond = Boolean(result.readUInt8(2));
const readThird = result.readInt16LE(3);
const readFourth = result.toString('utf8', 5);

編集#2:ぐるぐる回っていたので、プロトコルバッファなどが必要になると思います。それらがまだ何であるか、またはそれらが適用されるかどうかは正確にはわかりませんが、すべてのメッセージのファイルでスキーマを指定し、JSONオブジェクトをそのスキーマにシリアル化して、それがバッファーを返すようにすることができます。クライアント/他のサーバーで同じスキーマを使用して逆シリアル化します。これについてもう少し調べます。

14

buffer'sの最初の引数は、String、Buffer、ArrayBuffer、Array、またはarray-likeオブジェクトでなければなりません。

その情報を考慮に入れて、Stringからバッファを作成することで、探しているものを実装できます。次のようになります。

let json = [ 5, false, 55, 'asdf' ];

let buffer = Buffer.from(JSON.stringify(json));
console.log('Buffer: ', buffer); // Buffer: <Buffer 5b 20 35 2c 20 66 61 6c 73 65 2c 20 35 35 2c 20 22 61 73 64 66 22 20 5d>

次に、JSONを次のように戻すことができます。

let converted = JSON.parse(buffer);
console.log('Parsed to json', converted); // Parsed to json [ 5, false, 55, 'asdf' ]
12
MauricioLeal