Как работает настройка endianess для DataView

Я читаю это объяснение DataView, и там есть пример:

var littleEndian = (function() {
  var buffer = new ArrayBuffer(2);
  new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
  // Int16Array uses the platform's endianness.
  return new Int16Array(buffer)[0] === 256;
})();

Я не очень понимаю, что делает эта линия:

new DataView(buffer).setInt16(0, 256, true /* littleEndian */);

Означает ли это, что данные, хранящиеся в битах диапазона[0;256], должны храниться в littleEndian?

1 ответ

  1. Предположим, мы создаем буфер массива и массив, как это:

    var dv = new DataView(new ArrayBuffer(4));
    

    Это означает, что у нас есть 32 бита в памяти:

    0000 0000 0000 0000 0000 0000 0000 0000
    

    Теперь мы хотим сохранить номер0x0103, который имеет шаблон:

    0000 0001 0000 0011
    

    Теперь, давайте сохраним это число в первых двух байтах, используя little endianess, и во вторых двух байтах, используя big endianess, и посмотрим, как это выложено в памяти. Так:

    dv.setInt16(0, 0x0103, true);
    dv.setInt16(2, 0x0103, false);
    

    Теперь биты DataViewимеют этот шаблон:

    0000 0011 0000 0001 0000 0001 0000 0011
    

    Вот код для проверки этого поведения:

    var little = dv.getUint16(0);
    little === 0x0103 // false
    little === 0x0301 // true
    
    var big = dv.getUint16(2);
    big === 0x0103 // true
    big === 0x0301 // false