在 Javascript(但不是 Node)中,如何划分两个 Uint8Arrays?

In Javascript (but not Node), how do I divde two Uint8Arrays?

我在浏览器中使用 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 对我来说没问题。

有一个库可以调用 BigInteger.. https://www.npmjs.com/package/big-integer

我没有看到使用 Uint8Array 的内置方法,但我发现这个 -> 有一种方法可以转换为十六进制,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>

尽管最大数量为:

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

以上,结果显然是错误的