Как сохранить 32-разрядное целое число в массивном буфере? - PullRequest
1 голос
/ 08 октября 2019

Кажется, я не понимаю Uint32Array. Согласно тому, что я прочитал о Uint8Array, я мог бы просто указать число внутри массива (Uint8Array([16]) или Uint8Array([96,56])), и результаты были именно такими. Однако, когда я пытаюсь сделать то же самое для большего числа, такого как Uint32Array([21640]), оно кажется урезанным. Где 21640 должен равняться 5488 в гексе, я получаю только 88. Как это на самом деле работает?

Редактировать: Elaborations

Я также пытаюсь объединить несколько ArrayBuffers вместе. Если я не ошибаюсь, readAsArrayBuffer выдает Uint8Array, и я пытаюсь добавить к этому некоторые 32-битные числа, используя https://gist.github.com/72lions/4528834

. Существует столько информации и примеров по Uint8Array ито, что было немного в Uint32Array, заставляет меня думать, что один из этих 32 будет хранить значение, как если бы оно было 4 из 8.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Наибольшее значение 8-разрядного числа без знака равно 255. Большие числа будут обрезаны или пролонгированы в зависимости от ОС / ЦП. Если вы хотите преобразовать 32-битные числа в 8-битный массив, попробуйте что-то вроде этого.

var number = 21640;
var byte1 = 0xff & number;
var byte2 = 0xff & (number >> 8);
var byte3 = 0xff & (number >> 16);
var byte4 = 0xff & (number >> 24);

var arr1 = Uint8Array([byte1,byte2,byte3,byte4]);

Просто измените порядок байтов при создании массива в зависимости от того, хотите ли вы маленький или большой порядковый номер.

0 голосов
/ 08 октября 2019

Вот рабочий пример, показывающий 5488 в консоли

    var bigNumber = new Uint32Array([21640]);
    console.log(bigNumber[0].toString(16));

Поскольку вы добавили больше к вопросу. Если вы хотите конвертировать

var byte1 = 0x88;
var byte2 = 0x54;
var byte3 = 0;
var byte4 = 0;

var bigValue = (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | (byte1);

console.log(bigValue);

Хотя вам нужно будет учитывать Endianness

...