gpt4 book ai didi

Java(来自字节数组的 BigInteger)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:22 26 4
gpt4 key购买 nike

我正在使用以下代码从十六进制字符串创建一个 BigInteger 并打印到输出。

package javaapplication2;

import java.math.BigInteger;
import javax.xml.bind.DatatypeConverter;

public class JavaApplication2 {
public static void main(String[] args) {
// Number in hexadecimal form
String HexString = "e04fd020ea3a6910a2d808002b30309d";
// Convertation from string to byte array
byte[] ByteArray = toByteArray(HexString);
// Creation of BigInteger from byte array
BigInteger BigNumber = new BigInteger(ByteArray);
// Print result
System.out.print(BigNumber + "\n");
}
public static String toHexString(byte[] array) {
return DatatypeConverter.printHexBinary(array);
}

public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
}
}

执行此代码后,我得到以下结果:

-42120883064304190395265794005525319523

但我希望看到这样的结果:

298161483856634273068108813426242891933

我做错了什么?

最佳答案

您正在传递一个字节数组,其中第一个字节的最高位已设置 - 使其为负数。来自constructor documentation :

Translates a byte array containing the two's-complement binary representation of a BigInteger into a BigInteger. The input array is assumed to be in big-endian byte-order: the most significant byte is in the zeroth element.

具有前导设置位的二进制补码二进制表示为负数。

要获得您想要的结果,您可以执行以下任一操作:

  • 在十六进制字符串前加上“00”,这样你的最高字节总是0
  • 将十六进制字符串直接传递给 BigInteger(String, int) 构造函数,其中符号是根据 "-" 开头是否存在来推断的字符串。 (很明显,您会传入 16 作为基数。)
  • 使用 BigInteger(int, byte[]) 构造函数,将 1 作为 signum 值传递

如果您的真实 上下文是您已经获得字节数组,并且您只是出于测试目的从十六进制字符串解析它,我会使用第三个选项。如果您真的有一个十六进制字符串作为输入,我会使用第二个选项。

关于Java(来自字节数组的 BigInteger),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32273482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com