将十六进制转换为浮点数时出错

Error Converting Hex to Float

我正在尝试将此十六进制值 C2DE70A4 转换为 Android。这是我为转换编写的代码:

try {
        String hexString = "C2DE70A4";
        float myFloat = Float.intBitsToFloat(Integer.parseInt(hexString, 16));
    }

catch (Exception e) {
        Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
    }

但它导致了异常并告诉我 Invalid int: "C2DE70A4"

任何人都可以帮助我进行转换吗?浮点值应为:-111.22

谢谢。

public class Test {
public static void main (String[] args) {

    String myString = "BF800000";
    Long i = Long.parseLong(myString, 16);
    Float f = Float.intBitsToFloat(i.intValue());
    System.out.println(f);
    System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
}
}

将十六进制字符串更改为 0xC2DE70A4..

0xC2DE70A4 十进制为 3,269,357,732,但 int 的最大值为 2,147,483,647。这就是您无法解析它的原因——解析后的值太大,无法放入一个 int 中。

您应该将字符串解析为 long,然后将其转换为 int,最后调用 Float.intBitsToFloat

long asLong = Long.parseLong(hexString, 16);
int asInt = (int) asLong;
float myFloat = Float.intBitsToFloat(asInt);
// or, just
float myFloat = Float.intBitsToFloat((int)Long.parseLong(hexString, 16));

详细解释:

从根本上说,问题在于 C2DE70A4 表示无符号值,而 Java 中的整数是有符号的。如果你将它解析为 long 然后查看它的位(通过 Long.toBinaryString),你会看到:

11000010110111100111000010100100

这是一个长度为 32 的字符串,因为 toBinaryString 省略了前导 0。那么为什么它不适合 32 位 int 呢?因为上面那个二进制字符串代表一个 unsigned 数字。或者,更准确地说,对于这个 signed,64 位,two's complement 数字,它真的是 shorthand:

0000000000000000000000000000000011000010110111100111000010100100

... 等于十进制的 3269357732,这超出了 int 的范围,因为 int 是有符号的,这意味着最左边的数字是符号而不是数字的大小(即 "big" 的大小)。

如果您将 long 转换为 int,它会丢弃最左边的 32 位数字,留下一个 32 位整数 11000010110111100111000010100100 ——对应于十进制的 -1025609564(同样是二进制补码)。如果您随后将该数字输入 intBitsToFloat,您将得到 -111.22.