【问题标题】:How to convert an hexadecimal string to a double?如何将十六进制字符串转换为双精度?
【发布时间】:2019-08-13 05:23:54
【问题描述】:

我将 0x0000 到 0x01c2 范围内的十六进制值从 BLE 获取到我的手机 a 为String。为了将其绘制在图表中,我必须将其转换为double,为此我尝试过this method,但遗憾的是它对我的情况无济于事。

这是来自提供的链接的少量修改代码:

String receivedData = CommonSingleton.getInstance().mMipsData; // 0x009a
long longHex = parseUnsignedHex(receivedData);
double d = Double.longBitsToDouble(longHex);

public static long parseUnsignedHex(String text) {
    if (text.length() == 16) {
        return (parseUnsignedHex(text.substring(0, 1)) << 60)
                | parseUnsignedHex(text.substring(1));
    }
    return Long.parseLong(text, 16);
}

任何进一步的帮助将不胜感激。提前致谢。

【问题讨论】:

  • 如果您只有从 0x0000 到 0x01c2 的值,听起来这不是 IEEE-754 编码的 double 值。您希望结果为 0 是什么?您希望 0x01c2 的结果是什么? 0x0100 呢?
  • 如果这些值是 0-450 范围内的值,您应该将它们解析为 intshort 值。如果你真的需要,你可以随时投到double
  • 您的代码是从那里复制粘贴的:stackoverflow.com/a/10708508/5529263 对吗?
  • @JonSkeet 0x0000 - 0(int), 0x01c2 - 450(int) 和 0x0100 - 256(int)
  • 对,所以你不应该调用Double.longBitsToDouble,因为你的十六进制代表一个IEEE-754浮点值——它只是一个整数。跨度>

标签: java android string hex double


【解决方案1】:

您的值不是 IEEE-754 浮点值的十六进制表示 - 它只是一个整数。所以只需将其解析为整数,删除前导“0x”前缀后:

public class Test {
    public static void main(String[] args) {
        String text = "0x009a";

        // Remove the leading "0x". You may want to add validation
        // that the string really does start with 0x
        String textWithoutPrefix = text.substring(2);
        short value = Short.parseShort(textWithoutPrefix, 16);
        System.out.println(value);
    }
}

如果你在别处真的需要double,你可以隐式转换:

short value = ...;
double valueAsDouble = value;

...但除非您真的需要,否则我会尽量避免这样做。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多