使用 java 中给定的浮点格式将十六进制转换为双精度
Convert hex to double with a given floating-point format in java
我有一个表示 64 位整数“0000000000EA6484”的十六进制值的字符串。我需要使用 Java 将其转换为双精度值“0.9155962467”。我得到的指示是格式化类型为 int64_t(8 字节)的 12.52 FP 值。
我通过谷歌搜索发现 int64_t datatype in C++ is a signed integer. I have also found this post 似乎相关但让我有点困惑。
最后,我尝试了以下 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 个小数位的定点格式。要将其从 64 位整数格式的这些位表示的整数转换为 Q12.52 格式中相同位表示的值,请将其除以 224:EA648416 = 1536115610, 15361156 / 224 = 0.9155962467193603515625。在 Java 中,将整数值除以 16777216 (224) 应该就足够了。
看来告诉你这是 12.52 FP 格式的人是错误的。即使存在一些端序问题或任何其他字节重新排序,也无法解释位相对于 12.52 格式的移位位置,因为它相差一个子字节分数(52 位 − 24 位 = 28 位,这是 3½ 字节)。
我有一个表示 64 位整数“0000000000EA6484”的十六进制值的字符串。我需要使用 Java 将其转换为双精度值“0.9155962467”。我得到的指示是格式化类型为 int64_t(8 字节)的 12.52 FP 值。
我通过谷歌搜索发现 int64_t datatype in C++ is a signed integer. I have also found this post 似乎相关但让我有点困惑。
最后,我尝试了以下 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 个小数位的定点格式。要将其从 64 位整数格式的这些位表示的整数转换为 Q12.52 格式中相同位表示的值,请将其除以 224:EA648416 = 1536115610, 15361156 / 224 = 0.9155962467193603515625。在 Java 中,将整数值除以 16777216 (224) 应该就足够了。
看来告诉你这是 12.52 FP 格式的人是错误的。即使存在一些端序问题或任何其他字节重新排序,也无法解释位相对于 12.52 格式的移位位置,因为它相差一个子字节分数(52 位 − 24 位 = 28 位,这是 3½ 字节)。