7

我使用的是浏览器内的 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 对我来说很好。

4

2 回答 2

2

有一个库可以使用调用 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>

于 2018-06-05T20:53:15.270 回答
1

虽然最大数量是:

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,结果显然是错误的

于 2018-06-05T21:00:56.280 回答