gpt4 book ai didi

java - 为什么 BigInteger 将 "80"(十六进制)解析为两个字节?

转载 作者:行者123 更新时间:2023-12-05 09:35:08 26 4
gpt4 key购买 nike

我想将十六进制字符串转换为字节数组。我认为使用 BigInteger 是个好主意。但对于大于 7F 的值,它会产生意想不到的结果。

我的代码:

    var bytes = new BigInteger("80", 16).toByteArray();
for (var b : bytes) System.out.println(b);

输出:

0
-128

为什么这会产生两个字节?

我希望 00FF 产生一个字节,0100FFFF 产生两个字节, 等等。


旁注:第一个字节似乎很重要:

new BigInteger(new byte[]{      (byte)0x80}); // produces -128 (negative!)
new BigInteger(new byte[]{ 0, (byte)0x80}); // produces 128
new BigInteger(new byte[]{0, 0, (byte)0x80}); // produces 128

最佳答案

因为 BigInteger 是有符号的。

你指定了十六进制的"80",你没有指定它是负数;因此最高位(二进制补码)必须为零。如果您尝试用一个字节表示 80,那么最高位为 1,因此它会是负数。

如果您尝试 new BigInteger("-80", 16).toByteArray(),您将得到一个字节,值为 -128

关于java - 为什么 BigInteger 将 "80"(十六进制)解析为两个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66064594/

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