Почему Javascript TypeDArray не работает?

У меня есть 4 байта ArrayBuffer, и я присвоил номер индексу 0, используя представление данных. Когда я пытаюсь получить значение с помощью представления данных, которое дает правильный результат, но не дает правильного результата, когда я пытаюсь получить значение с помощью типизированного массива. Кто-нибудь может помочь в этом? Вот код:

var buffer = new ArrayBuffer(4);
var dataview = new DataView(buffer);
dataview.setUint32(0,5000);

var unint32 = new Uint32Array(buffer);

console.log(unint32[0]); //2282946560 instead of 5000
console.log(dataview.getUint32(0)); //shows correctly 5000

person Opencartmart    schedule 19.06.2015    source источник
comment
Тесно связан (или дубликат?) Javascript Typed Arrays and Endianness   -  person apsillers    schedule 19.06.2015


Ответы (1)


Это потому, что вы используете неправильный порядок байтов при использовании setUint32. В частности, вам нужно хранить представление с прямым порядком байтов, потому что ваше оборудование ведет себя именно так.

Вы можете увидеть это более легко, используя шестнадцатеричные значения. Теперь 5000 === 0x1388, а 2282946560 = 0x88130000. Вы видите здесь закономерность?

Попробуйте это вместо этого:

dataview.setUint32(0, 5000, true);

var unint32 = new Uint32Array(buffer);

console.log(unint32[0]); // 5000, yay!

Как указали апсилеры, если вы собираетесь использовать dataview для получения значения, вам также придется использовать dataview.getUint32(0, true).

Напоследок, если вам просто нужно работать с Uint32 числами, забудьте о DataView и сразу используйте типизированный массив:

var buffer = new ArrayBuffer(4);
var unint32 = new Uint32Array(buffer);
unint32[0] = 5000;

Вы никогда не ошибетесь с этим.

С другой стороны, если вам нужно заполнить ArrayBuffer необработанными двоичными данными, вы хотели бы проверить порядок байтов вашего оборудования с помощью этот маленький трюк.

person MaxArt    schedule 19.06.2015
comment
@apsillers, ты прав. Я думаю, что в этом случае я должен использовать dataview.getUint32(0,true) - person Opencartmart; 19.06.2015