2

バイナリ フレームを使用した 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

エンディアンの問題を修正するためのより良い方法はありますか?

4

1 に答える 1

1

Freenode の #javascript からこのコードを取得しましたが、まったく同じことを別の方法で実行しているにもかかわらず、驚くほど機能します :|

function valueToByteArray(value, bytes_length) {
    var bytes_array = [];
    while (bytes_length > 0){
        var byte = value & 0xFF;
        value >>= 8;
        bytes_length--;

        bytes_array.push(byte);
    }
    return bytes_array.reverse();
}

console.log(valueToByteArray(-2000000, 4));
<< [255, 225, 123, 128]
于 2013-02-20T16:08:52.563 に答える