21

2 つの JavaScript ArrayBuffers が等しいかどうかをテストする方法はありますか? メッセージ作成メソッドのテストを書きたいと思います。私が見つけた唯一の方法は、ArrayBuffer を文字列に変換してから比較することです。私は何か見落としてますか?

次のコードは、真であるべきだと思っていても、偽を与えています。

(function() {
    'use strict';

    /* Fill buffer with data of Verse header and user_auth
     * command */
    var buf_pos = 0;
    var name_len = 6
    var message_len = 4 + 1 + 1 + 1 + name_len + 1;

    var buf = new ArrayBuffer(message_len);
    var view = new DataView(buf);
    /* Verse header starts with version */
    view.setUint8(buf_pos, 1 << 4); /* First 4 bits are reserved for version of protocol */
    buf_pos += 2;
    /* The lenght of the message */
    view.setUint16(buf_pos, message_len);
    buf_pos += 2;

    buf_pos = 0;
    var buf2 = new ArrayBuffer(message_len);
    var view2 = new DataView(buf);
    /* Verse header starts with version */
    view2.setUint8(buf_pos, 1 << 4); /* First 4 bits are reserved for version of protocol */
    buf_pos += 2;
    /* The lenght of the message */
    view2.setUint16(buf_pos, message_len);
    buf_pos += 2;


    if(buf == buf2){
        console.log('true');
    }
    else{
        console.log('false');
    }


}());

view と view2 を比較しようとすると、再び false になります。

4

6 に答える 6

21

==またはを使用して JavaScript で 2 つのオブジェクトを直接比較することはできません===
これらの演算子は、参照の等価性のみをチェックします (つまり、式が同じオブジェクトを参照しているかどうか)。

ただし、DataViewまたはArrayViewオブジェクトを使用して、オブジェクトの特定の部分の値を取得し、ArrayBufferそれらをチェックすることができます。

ヘッダーを確認する場合:

if (  view1.getUint8 (0) == view2.getUint8 (0)
   && view1.getUint16(2) == view2.getUint16(2)) ...

または、バッファのグローバル性を確認したい場合:

function equal (buf1, buf2)
{
    if (buf1.byteLength != buf2.byteLength) return false;
    var dv1 = new Int8Array(buf1);
    var dv2 = new Int8Array(buf2);
    for (var i = 0 ; i != buf1.byteLength ; i++)
    {
        if (dv1[i] != dv2[i]) return false;
    }
    return true;
}

に基づいて複雑なデータ構造を実装する場合は、独自のクラスを作成することをお勧めします。そうしないと、マッチ棒を構造に出し入れするたびArrayBufferに面倒な raw DataView/インスタンスに頼らなければならなくなります。ArrayView

于 2014-02-04T13:39:12.227 に答える
3

2 つの TypedArray が等しいかどうかをテストするには、不一致が見つかるとすぐに終了するeveryメソッドの使用を検討してください。

const a = Uint8Array.from([0,1,2,3]);
const b = Uint8Array.from([0,1,2,3]);
const c = Uint8Array.from([0,1,2,3,4]);
const areEqual = (first, second) =>
    first.length === second.length && first.every((value, index) => value === second[index]);

console.log(areEqual(a, b));
console.log(areEqual(a, c));

toString()これは、違いが見つかった後でも残りの配列を反復処理する代替 (比較など) よりもコストがかかりません。

于 2020-03-23T16:56:58.110 に答える