在java中用给定的浮点格式将十六进制转换为双数。

问题描述 投票:0回答:1

我有一个字符串,代表一个64位整数 "00000000EA6484 "的HEX值。我需要使用Java将其转换为双值 "0.9155962467"。我所得到的指令是格式化一个12.52 FP值,类型为int64_t(8字节)。

我发现,通过一些google的 int64_t 在C++中,数据类型是一个有符号的整数。我还发现 此职位 这似乎是相关的,但让我有点困惑。

最后,我尝试了下面的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;
}
}
java floating-point binary hex double
1个回答
4
投票

如图所示。0000000000EA6484 代表0.9155962467193603515625,是Q40.24格式,而不是浮点格式。这是一种定点格式,有40个整数位(包括一个符号位)和24个分数位。要把这些位数所代表的整数转换成Q12.52格式中相同位数所代表的值,请将其除以2。24: EA648416 = 1536115610, 15361156 224 = 0.9155962467193603515625. 在Java中,将整数值除以16777216(224)应该足够了。

似乎谁告诉你这是一个12.52 FP格式是错误的。即使有一些endian的问题,或任何其他的字节重新排序,这将无法解释与12.52格式相关的位的移动位置,因为它相差一个子字节的分数(52位-24位=28位,也就是3个半字节)。

© www.soinside.com 2019 - 2024. All rights reserved.