Java:浮动到十六进制并反转

时间:2016-07-05 08:19:28

标签: java floating-point hex data-conversion modbus

Heyho,

我有一个小问题。所以我得到了一个测量设备,我通过modbus检索数据。我通常通过“Simply Modbus TCP Client”检查值,它会显示正确的数据。现在我想自动化这个让我遇到麻烦的过程。

我得到了正确的答案,但棘手的部分似乎是转换。我在十六进制中得到相同的响应但是当我转换它时,我不会得到相同的结果。

查看屏幕截图Simply Modbus Client - Screenshot

在那里你可以看到左边的响应,右边的字节(4175 AF8A)和相应的值(22739113)。我希望“bytes”是十六进制表示,但我不能将它们转换为十进制数。

我写了一个小的java程序来显示这些数字及其转换。

public static void main(String[] args) {

    HashMap<String, Integer> values = new HashMap<>();
    values.put("4175AF52", 22738214);
    values.put("41D61FAC", 1484698204);
    values.put("419A08A0", 109193237);

    Iterator it = values.entrySet().iterator();
    while (it.hasNext()) {
        System.out.println("/************************************************/");
        Map.Entry pair = (Map.Entry) it.next();
        int hexIntepretation = (int) Long.parseLong((String) pair.getKey(), 16);

        // Print the result
        System.out.println(pair.getKey() + " = " + pair.getValue());
        System.out.println("Expected:\t" + pair.getValue());
        System.out.println("Hex to Int:\t" + hexIntepretation);
        System.out.println("Int to Hex:\t" + Integer.toHexString((int) pair.getValue()));
        System.out.println("Float to Hex:\t" + Float.toHexString((int) pair.getValue()));
        System.out.println("Hex to Int:\t" + Integer.parseInt((String) pair.getKey(), 16));

        it.remove(); // avoids a ConcurrentModificationException
    }
}

运行此代码段会显示此输出:

/*******************************************/
419A08A0 = 109193237
Expected:       109193237
Hex to Int:     1100613792
Int to Hex:     6822815
Float to Hex:   0x1.a08a06p26
Hex to Int:     1100613792
/*******************************************/
41D61FAC = 1484698204
Expected:       1484698204
Hex to Int:     1104551852
Int to Hex:     587eb25c
Float to Hex:   0x1.61facap30
Hex to Int:     1104551852
/*******************************************/
4175AF52 = 22738214
Expected:       22738214
Hex to Int:     1098231634
Int to Hex:     15af526
Float to Hex:   0x1.5af526p24
Hex to Int:     1098231634

无论我做什么,我都无法获得价值。但是,当我执行“float-to-hex”时,我会在那里找到一些初始值。

示例:

417 5AF52 = 22738214

Float to Hex:0x1。 5af52 6p24

然而,我不能把各个部分拼凑起来解决这个难题。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

当你的图像显示“64位浮点数”时,我会将字节解释为double

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

答案 1 :(得分:2)

它表示“64位浮点数”,但GUI只显示32位。显然,视图会关闭其他4个字节,但在左侧的字段中,您可以看到它们。

正如您已经提到的,当您复制“字节”列中的所有内容时,您还会获得“缺失”内容。

答案 2 :(得分:0)

不幸的是,显示器似乎没有显示浮点值:

    int bits = 0x4175_AF8A;
    float f = Float.intBitsToFloat(bits);
    System.out.println(f);

给出:

15.355356

感谢@Fildor,正确的计算:

    long nbits = 0x1769_0314_4175_AF8AL;
    nbits = 0x4175_AF8A_19ED_F046L;
    double d = Double.longBitsToDouble(nbits);
    System.out.println(d); // 2.273910562059047E7