私のノードサーバーでBuffer
、JavacriptクライアントでBuffer
を使用しています。Javascriptオブジェクトをノードバッファに変換するには?
バイトを節約する目的で、私はJSONとは対照的にバイナリとしてWebソケットを介してサーバーにデータを送信しようとしています。
私は[ 5, false, 55, "asdf" ]
のJavascriptオブジェクトを持っていたので、それを送信する前にクライアント上のバッファに変換したいと思います。たぶん、このような何か:このような
object.toBuffer('int16', 'bool', 'int16', 'utf8');
とサーバー上のそれを読んで何か:
var obj = buffer.read('int16', 'bool', 'int16', 'utf8');
私は、現在のソリューションを見ていると私はちょうどconcat
の多くを行う必要がありように見えますバイトオフセット/長さの指定、intからbooleanへの変換など
もっと良い方法がありますか?
編集:あなたは現在あなたがそれをやる必要があると思います。私の問題は、あまりにも冗長でエラーが発生しやすく、この操作はコード内のさまざまな場所で実行されるため、より簡潔でエレガントな方法を探しています。
// 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オブジェクトをそのスキーマにシリアル化してバッファを返すように見えますクライアント/他のサーバーで同じスキーマを使用して逆シリアル化します。私はこれをもう少し見ていくつもりです。
)それをソケットにとにかくgzipはJSONの繰り返しを処理する必要がありますが、配列にはほとんど何もありません。 – dandavis
@dandavis:なぜそれはブロブでなければならないでしょうか? 'connection.binaryType =" arraybuffer ";'を実行できませんか? –
hmm多分、私はそれがソケットオプションであることを知らなかった、最後に私が汚れていた、ブロブだけが私のプロジェクトで働いていた... – dandavis