【问题标题】:Java convert byte[] to BigIntegerJava 将 byte[] 转换为 BigInteger
【发布时间】: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


【解决方案1】:

BigInteger(byte[]) 采用二进制补码表示,而bigInt.fromArray() 采用默认基数为 10 的数字数组。

正如 dave_thompson_085 所说,您可以使用基数 256:

var bigInteger = bigInt.fromArray(bytes, 256);
console.log("bigInteger: " + bigInteger); // 108170603228769

【讨论】:

  • 运行时出现以下错误:/Users/sietzevliegen/node_modules/big-integer/BigInteger.js:1122val = val.add(digits[i].times(pow));TypeError: digits[i].times is not a function
  • 它适用于http://peterolson.github.com/BigInteger.js/BigInteger.min.js,不知道为什么它会失败。
  • 它确实有效。我传递的变量不正确,这就是我搞砸的方式。使用原始问题中的 sn-p 解决了该问题
猜你喜欢
  • 2011-10-10
  • 2023-04-07
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2014-04-18
  • 2011-06-08
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多