2016-07-08 2 views
7

私のノードサーバーで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オブジェクトをそのスキーマにシリアル化してバッファを返すように見えますクライアント/他のサーバーで同じスキーマを使用して逆シリアル化します。私はこれをもう少し見ていくつもりです。

+0

)それをソケットにとにかくgzipはJSONの繰り返しを処理する必要がありますが、配列にはほとんど何もありません。 – dandavis

+0

@dandavis:なぜそれはブロブでなければならないでしょうか? 'connection.binaryType =" arraybuffer ";'を実行できませんか? –

+0

hmm多分、私はそれがソケットオプションであることを知らなかった、最後に私が汚れていた、ブロブだけが私のプロジェクトで働いていた... – dandavis

答えて

7

バッファの最初の引数は、String、Buffer、ArrayBuffer、Array、またはarray-likeオブジェクトである必要があります。

この情報を考慮すると、文字列からバッファを作成することで、探しているものを実装できます。そのように戻って、あなたはあなたのJSONをもたらすことができる

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> 

:それは次のようになります(送信するためにBLOBにバッファを変換する必要があります

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

'新しいBuffer()'は、(ノード8.2でまだ動作していても)現在は推奨されていません。サポートされるメソッドは 'Buffer.from()'です。 – Danibix

関連する問題