我有一个字符串,代表一个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;
}
}
如图所示。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个半字节)。