2016-04-24 8 views
1

整数(符号付き)を32ビット(ビッグエンディアン)にオクテットストリームに変換し、オクテットストリームを配列値として バッファオブジェクトのコンストラクタに渡します。私は値-2000のために例えばコンソールでそれを作成することができますJavascript int値をオクテットストリームに変換する

<code> 
buf = Buffer(4) 
buf.writeInt32BE(-2000) 
buf // is <Buffer ff ff f8 30> 
buf1 = new Buffer([0xff, 0xff, 0xf8, 0x30]) 
</code> 

値-3000は、例えば、-3000のためである:0xffで、0xffで、0xf4、0x48

しかし、フレームワーク私はwriteInt32BE関数ではなく、例外をスローします。

writeInt32BEを使用せずに符号付き32ビット整数値をオクテット配列ストリームに変換するにはどうすればよいですか?

値を受け取り、オクテットストリームの配列を返す関数です。

+0

'Buffer'は、フレームワークではなくNodeによって提供されるグローバルです。したがって、有効なパラメータを持つ '(Buffer instance).writeInt32BE()'の例外を取得するべきではありません。例外を引き起こす_exact_コードは、ノードで実行されており、フレームワークは何ですか? – traktor53

答えて

1

4バイトの配列バッファを使用して、データビューに変換し、ビューでsetInt32を呼び出すと動作するようです。このアプローチは、マシンアーキテクチャに依存しないリトルエンディアンとビッグエンディアン(デフォルト)フォーマットの両方の仕様をサポートします。

function bigEnd32(value) { 
    var buf = new ArrayBuffer(4); 
    var view = new DataView(buf); 
    view.setInt32(0, value); 
    return view; 
} 

// quick test (in a browser) 
var n = prompt("Signed 32: "); 
var view = bigEnd32(+n); 
for(var i = 0 ; i < 4; ++i) 
    console.log(view.getUint8(i)); 

ドキュメントは等「MDN ArrayBuffer」「MDNデータビュー」を探して位置していた基本的な配列バッファにアクセスするプロパティの詳細DataViewをチェックアウト - あなたはあなたのアプリケーションに合ったコードを微調整することができるかもしれません。

+0

getInt32(i)で印刷するとRangeErrorが発生します。実際には-2000を変換します。 –

+0

下位のバッファに4オクテットが含まれています。 'view.getInt32(0)'はそれを32ビット整数として返します。ゼロでないオフセットをgetInt32に渡すと、範囲エラーが発生します。テストコードの '+ n 'は文字列を数値に変換し、負の数値ではなく正の数値に変換します。 -2000は0xff 0xff 0xf8 0x30を期待通りに与えます。 – traktor53