How to test for equality in ArrayBuffer, DataView, and TypedArray

arraybuffer, javascript, typed-arrays

Solution

You cannot compare two objects directly in JavaScript using `==` or `===`. These operators will only check the equality of references (i.e. if expressions reference the same object).

You can, however, use `DataView` or `ArrayView` objects to retrieve values of specific parts of `ArrayBuffer` objects and check them.

If you want to check headers:

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

Or if you want to check the globality of your buffers:

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;
}

If you want to implement a complex data structure based on `ArrayBuffer`, I suggest creating your own class, or else you will have to resort to cumbersome raw `DataView` / `ArrayView` instances each time you will want to move a matchstick in and out of the structure.

Problem

Is there a way how to test if two JavaScript ArrayBuffers are equal? I would like to write test for message composing method. The only way I found is to convert the ArrayBuffer to string and then compare. Did I miss something? Following code is giving false, even if I think that it should be true: ``` (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'); } }()); ``` If I try to compare view and view2 it's false again.

Original source