Я тестирую ArrayBuffer и удивляюсь, почему результат выглядит так: - PullRequest
0 голосов
/ 17 мая 2019

Привет, я начинающий программист, который изучает JavaScript. Когда я смотрю на источник, я создаю представление с DataView (буфером) и помещаю значение в позицию 0 с помощью setUint32. Почему значение 536870912 не меняется на 32, когда я снова загружаю буфер с Uint32Array?

var buffer = new ArrayBuffer(76);
var view = new DataView(buffer);

var value = 20000000;

// set value 536807912
view.setUint32(0, parseInt(value, 16));

// [17/05/2019 10:00:20.149] [LOG]    getUint32 536870912
console.log('getUint32 ' + view.getUint32(0));

var test = new Uint32Array(buffer);

/* [17/05/2019 10:00:20.150] [LOG]    Uint32Array [ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] */
console.log(test);

1 Ответ

3 голосов
/ 17 мая 2019

Причина, по которой вы видите 32 с использованием Uint32Array, связана с Endianness .При использовании DataView функции setUint32 и getUint32 имеют дополнительный параметр littleEndian, а в случае его отсутствия по умолчанию используется значение big-endian.Затем, используя Uint32Array, он будет использовать порядковый номер вашей системы, который в данном случае является прямым порядком байтов.

Так что в случае Uint32Array вы устанавливаете значение с помощью big-endian, а затем извлекаете его с помощьюlittle-endian, приводящий к значению 32.

Чтобы проиллюстрировать это, вот два значения, использующие различные порядки байтов:

536870912 =
Little-endian:  00 00 00 20
Big-endian: 20 00 00 00

32 =
Little-endian:  20 00 00 00
Big-endian: 00 00 00 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...