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

Java 将十六进制转换为浮点时出错,java,android,floating-point,hex,Java,Android,Floating Point,Hex,我正在尝试在Android中转换这个十六进制值。这是我为转换而编写的代码: try { String hexString = "C2DE70A4"; float myFloat = Float.intBitsToFloat(Integer.parseInt(hexString, 16)); } catch (Exception e) { Toast.makeText(getApplicationContext(),e.getMessage

我正在尝试在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();
    }
但它导致了一个异常,并告诉我无效int:“C2DE70A4”

有人能帮我转换吗?浮点值应为:-111.22


谢谢。

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

十进制的0xC2DE70A4是3269357732,但int的最大值是2147483647。这就是为什么不能解析它——解析后的值太大,无法放入int

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)));
}
}
您应该将字符串解析为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.tobinarysting
),您将看到:

11000010110111100111000010100100
这是一个32长度的字符串,因为
tobinarysting
省略了前导0。那么为什么它不适合32位整数呢?因为上面的二进制字符串表示一个无符号数。或者,更准确地说,它实际上是这个有符号的64位数字的简写:

。。。它在十进制中等于3269357732,这超出了
int
的范围,因为
int
是有符号的,这意味着最左边的数字是符号,而不是数字大小的一部分(也称为“多大”)


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

float myFloat=float.intBitsToFloat((int)Long.parseLong(hextstring,16));我认为,如果您解释了为什么代码会修复它,而不仅仅是提供没有注释的代码,那么这个答案会有很大的改进。教一个人钓鱼,而不是给他们一条鱼,诸如此类。
0000000000000000000000000000000011000010110111100111000010100100