バイナリ フレームを使用した WebSocket ネットワークに基づくアプリを作成しています。Python サーバーから JS クライアントに値を送信したい。
私が知っていることから、8ビット以上にパックされた値は、アンパックおよびパック時のエンディアンに依存します。残念ながら、ブラウザはすべてをリトルエンディアンで送信しているようで、ネットワークはビッグエンディアンです。したがって、エンディアンが問題にならないように、すべての値をバイト配列にパックすることをお勧めします。
私はjavascript用にこの関数を書きました:
valueToByteArray: function(value, bytes_length) {
var bytes_array = [];
for (var i=bytes_length - 1; i>=0; --i) {
conjunction_val = 0xFF << i*8;
shift = i*8;
bytes_array.push((value & conjunction_val) >> shift);
}
return bytes_array;
}
そして、私はそれのためのテストを持っています:
test("Pack value to Byte array", function() {
equal(
BufferUtility.valueToByteArray(-2000000, 4),
[255, 225, 123, 128],
"Value packed OK"
); // fail returns [-1, 225, 123, 128], same function in python returns [255L, 225, 123, 128]
equal(
BufferUtility.valueToByteArray(4000000, 4),
[0, 61, 9, 0],
"Value packed OK"
); // pass
equal(
BufferUtility.valueToByteArray(0, 2),
[0, 0],
"Value packed OK"
); // pass
equal(
BufferUtility.valueToByteArray(-1, 2),
[128, 1],
"Value packed OK"
); // fail returns [255, 255]
});
しかし、2 回目と 3 回目のテスト パスのみで、符号付きの値では機能しないようです。struct.pack('>h', -1)
Python でもこの値を確認したところ、 isのように見えます\xFF\xFF
。正直わかりません。MSb は符号ビットであるため、shortint -1 バイナリは imo である必要があります1000000000000001
。
エンディアンの問題を修正するためのより良い方法はありますか?