将Hex转换为Float时出错

时间:2015-11-22 06:28:06

标签: java android floating-point hex

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

CSS

但它导致异常,并告诉我无效的int:“C2DE70A4”

有人可以帮我转换吗? Float值应为: -111.22

感谢。

3 个答案:

答案 0 :(得分:4)

十进制的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中的int是有符号的。如果您将其解析为long,然后查看其位(通过Long.toBinaryString),您将看到:

11000010110111100111000010100100

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

0000000000000000000000000000000011000010110111100111000010100100

...等于3269357732(十进制),超出int的范围,因为int已签名,这意味着最左边的数字是符号而不是数字幅度的一部分(又名“大”)。

如果您使用long并将其转换为int,它将丢弃最左边的32位数字,留下32位整数11000010110111100111000010100100 - 这对应于-1025609564(十进制)(再次,二进制补码)。如果您接着将该号码输入intBitsToFloat,则会获得-111.22。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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)));
}
}