在Java中使用给定的浮点格式将十六进制转换为双精度

阿拉贡:

我有一个表示64位整数“ 0000000000EA6484”的十六进制值的字符串。我需要使用Java将其转换为双精度值“ 0.9155962467”。我已经给出的指令是格式化int64_t(8字节)类型的12.52 FP值。

我通过一些搜索发现C ++ 中的int64_t数据类型是有符号整数。我也发现了这篇帖子似乎很相关,但让我有些困惑。

最终,我尝试了以下Java代码来查看是否获得了预期的结果,但在两种情况下均得到了“ 7.5894195E-317”。我确信我不知道如何解决问题,希望能有所帮助,或者预期的输出是错误的。

import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) {
String hexString = "0000000000EA6484";//0.9155962467

    long longValue = Long.parseLong(hexString, 16);
    longValue = Long.parseUnsignedLong(hexString, 16);
    System.out.println(longValue);

    double doubleValue = Double.longBitsToDouble(longValue);
    System.out.println(doubleValue);

    byte[] bytes = hexStringToByteArray(hexString);
    doubleValue = ByteBuffer.wrap(bytes).getDouble();
    System.out.println(doubleValue);
}
public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}
}
埃里克·Postpischil:

如图所示,0000000000EA6484以Q40.24格式而不是浮点格式表示0.9155962467193603515625。这是具有40个整数位(包括符号位)和24个小数位的定点格式。为了把它转换从该值表示由在Q12.52格式相同的位由这些比特在64比特整数格式表示的整数,除以2 24:EA6484 16 = 15361156 10,2分之15361156 24 = 0.9155962467193603515625 。在Java中,将整数值除以16777216(2 24)就足够了。

似乎有人告诉您这是12.52 FP格式是错误的。即使存在字节序问题或任何其他字节重新排序,也无法解释位相对于12.52格式的移位位置,因为它相差一个子字节分数(52位-24位= 28位,这是3½字节)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章