【发布时间】:2019-03-08 10:22:45
【问题描述】:
在 Java 中,我可以像这样从 String 获取 BigInteger:
public static void main(String[] args) {
String input = "banana";
byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
BigInteger bigInteger = new BigInteger(bytes);
System.out.println("bytes: " + Arrays.toString(bytes));
System.out.println("bigInteger: " + bigInteger);
}
哪个会打印
bytes: [98, 97, 110, 97, 110, 97]
bigInteger: 108170603228769
我正在尝试使用 big-integer library 在 JavaScript 中获得相同的结果。但是正如你所看到的,这段代码返回了一个不同的值:
var bigInt = require('big-integer');
function s(x) {
return x.charCodeAt(0);
}
var bytes = "banana".split('').map(s);
var bigInteger = bigInt.fromArray(bytes);
console.log("bytes: " + bytes);
console.log("bigInteger: " + bigInteger);
输出:
bytes: 98,97,110,97,110,97
bigInteger: 10890897
有没有办法获得我在 Java 中使用 JavaScript 获得的结果? 如果数组的长度为 32,这也可能吗?
【问题讨论】:
-
@rottenoats big-integer 是一个 Javascript 库。这是一个Javascript问题。
-
您能解释一下
[98, 97, 110, 97, 110, 97]是如何转换为108170603228769的吗?恐怕我看不到模式。一个更简单的示例,例如具有两个或三个元素的数组,可能会提供信息 -
您链接的文档页面显示
fromArray默认基数为 10。鉴于此字节数组已清除第一个字节的最高位,the Java BigInteger ctor is using effectively base 256 bigendian 使用基数 256。 -
@CertainPerformance:为字节和 BigInteger 尝试十六进制输出。然后您将看到各个字节的去向。十六进制输出每个字节需要两个十六进制数字。
-
@CertainPerformance:字节为十六进制:
[62,61,6E,61,6E,61]。值为108170603228769的BigInteger 的十六进制表示为62616E616E61。我想现在很清楚这些值是如何转换为 BigInteger 的。从十进制表示中并不明显,但在十六进制中是。
标签: javascript java arrays biginteger uint8array