【问题标题】:Big Endian Hex Number conversation大端十六进制数对话
【发布时间】:2021-04-02 16:05:44
【问题描述】:

我有以下 4 个字节的十六进制字符串 (38 01 02 00),预期的输出是 (201.38) 十进制,就像第一个输入相反。 如果给出 (89 00 00 00),那么预期结果将是 (0.89)

我不知道这次对话的数学名称。

  1. 我尝试将 Big-endian 转换为 little-endian,但结果以 (00020138) 失败。
  2. 我试过写一个简单的方法,但结果还是错误(1492992770)
int htonl(final int value) {
        return ByteBuffer
                .allocate(4)
                .putInt(value).order(ByteOrder.nativeOrder())
                .getInt(0);
}

【问题讨论】:

  • 201.38 到底是什么意思?带有两个小数位的十进制数?或者像IP地址中的一些虚线数字组?还是别的什么? Btút 我的两个猜测都与您方法的结果类型是整数相矛盾。
  • @RalfKleberhoff 十进制表示法,带两位小数呵呵

标签: java math hex


【解决方案1】:

似乎是 BCD 编码(Binary Coded Decimal),其中每个 4 字节组代表一个小数位。

并且字节顺序是小端 - 它从最低有效字节开始。

我所看到的都表明小数点位于固定位置,但这只是猜测。

所以,您第一次尝试的结果很接近。只需将其除以 100,就完成了。

【讨论】:

  • 感谢您抽出宝贵时间澄清其 BCD 编码。
【解决方案2】:

在@Ralf Kleberhoff 的帮助下解决了这个问题

  1. 我先反转了十六进制输入
  2. 将输出除以 100
public static String reverse(final String originalHex) {

        final int lengthInBytes = originalHex.length() / 2;
        final char[] chars = new char[lengthInBytes * 2];
        for (int index = 0; index < lengthInBytes; index++) {
            final int reversedIndex = lengthInBytes - 1 - index;
            chars[reversedIndex * 2] = originalHex.charAt(index * 2);
            chars[reversedIndex * 2 + 1] = originalHex.charAt(index * 2 + 1);
        }
        return new String(chars);
}
final float f = Float.parseFloat(reverse("89000000"));
System.out.println(f / 100);
  1. 给定的输入是 89000000,结果是预期的 0.89。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2015-06-25
    • 2021-02-07
    • 2018-07-26
    • 2011-12-09
    • 2019-03-02
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多