【问题标题】:In Javascript (but not Node), how do I divde two Uint8Arrays?在 Javascript(但不是 Node)中,我如何划分两个 Uint8Arrays?
【发布时间】:2018-11-15 10:27:10
【问题描述】:

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

【问题讨论】:

  • 如果您所在区域的每一项都代表数字中的一个“地点”,那么您的第一个数字远大于 0xffffffff。这是256 ** 8。除非我误解了您是如何从数组中获取整数的。
  • btw 8 字节 = 2^64 = 18446744073709552000 > Number.MAX_SAFE_INTEGER = 9007199254740991
  • 使用大整数库。一个好的应该支持 Uint8Arrays 作为输入和输出。

标签: javascript arrays division bigint uint8array


【解决方案1】:

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

【讨论】:

  • 谢谢。快速跟进您的 buf2hex 函数。我有这一行——“var bd1 = bigInt(buf2hex(new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), 16));"但它会导致“错误:无效整数:ffffffffffffffff”错误。我错过了什么?
  • 你把括号放错地方了。 -> 255]), 16)); 应该是 255])), 16);
  • 啊我的错!谢谢,-
【解决方案2】:

虽然最大数量是:

8 bytes = 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 以上,结果显然是错误的

【讨论】:

  • 8 字节,无符号 64 位 = 18446744073709551615
  • 是的,可能是错误的,因为我在 JavaScript 上检查过,这就是为什么使用大于 MAX_SAFE_INTEGER 的数字是不安全的,我会修正我的答案,谢谢:)
  • 第一个粗体数字是 2^64-1,而不是 2^64。由于双精度浮点数的格式,最大安全整数为 2^53-1,以防您不知道。
  • 谢谢,已修复:) 是的,如果整数超过字节 - 它“变成”浮点数
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多