Как разделить два массива Uint8 в Javascript (но не в Node)? - PullRequest
0 голосов
/ 05 июня 2018

Я использую JavaScript в браузере, а не NodeJS.У меня есть два Uint8Arrays ...

var d1 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255])
var d2 = new Uint8Array([255, 255, 255, 255, 237, 49, 56, 0])

Каждый будет иметь ровно 8 элементов, которые являются целыми числами от 0 до 255. Каждый массив представляет большее число.Например, первый массив представляет положительное целое число

0xffffffff

Мой вопрос: как я могу разделить d1 на d2 и получить результат?Я прочитал, что максимальное значение для целого числа в Javascript составляет 2 ^ 53, что, я считаю, меньше, чем максимальное число, которое я мог бы иметь.Мне все равно, какой тип объекта будет получен, но Uint8Array меня устраивает.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Хотя максимальное число будет:

8 байт = 2 ^ 64-1 = 18446744073709551615 (отметьте 2 ** 64 в браузере - результат будет другим!)

, что больше максимального безопасного целого числа:

Number.MAX_SAFE_INTEGER = 9007199254740991

В любом случае я бы попробовал что-то вроде этого:

var d1 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
var d2 = new Uint8Array([255, 255, 255, 255, 237, 49, 56, 0]);

function decodeInt(uint8a){
    return parseInt('0x'+Array.from(uint8a).map(x=>('0'+x.toString(16)).slice(-2)).join(''));
}

decodeInt(d1) / decodeInt(d2);

РЕДАКТИРОВАТЬ

Результаты, очевидно, неверны, если вы выше Number.MAX_SAFE_INTEGER

0 голосов
/ 05 июня 2018

Существует библиотека, которую вы можете использовать вызовом BigInteger .. https://www.npmjs.com/package/big-integer

Я не видел встроенного способа использования Uint8Array, но я нашел это -> Javascript ArrayBuffer to Hex , у которого был способ конвертировать в гекс, с этим bigInteger, кажется, все в порядке.

Так что вот пример использования.->

var d1 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
var d2 = new Uint8Array([255, 255, 255, 255, 237, 49, 56, 0]);

function buf2hex(buffer) { // buffer is an ArrayBuffer
  return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

var bd1 = bigInt(buf2hex(d1), 16);
console.log(`value 1 = ${bd1.toString()}`);
var bd2 = bigInt(buf2hex(d2), 16);
console.log(`value 2 = ${bd2.toString()}`);
var r = bd1.divmod(bd2);
console.log(`result ${r.quotient.value} remainder ${r.remainder.value}`);
<script src="https://peterolson.github.io/BigInteger.js/BigInteger.min.js"></script>
...