将数据从十六进制解包到浮点数

时间:2014-03-20 13:15:01

标签: c floating-point hex endianness

我有Big Endian格式的传入数据

uint8_t u8DataA[] = {0x40, 0xAD, 0x70, 0xB8};

需要解压缩到 float 。结果应 3768.36 。无论我如何将字节填入浮点数我都不会得到这个结果。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您获得了64位double表示的前四个字节,而不是32字节表示的四个字节。

根据IEEE 754计算器,3768.36的64位表示是

0x40, 0xAD, 0x70, 0xB8, 0x51, 0xEB, 0x85, 0x1F
^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^
This is what you have   This part is missing

您取了它的前四个字节,并尝试将其重新解释为float。这就是为什么它不起作用。

3768.36的32位表示是

0x45, 0x6B, 0x85, 0xC3

通过将字节填充到数组中并将其重新解释,将其转换为float,生成所需的结果(demo)。

答案 1 :(得分:0)

直接将这些十六进制数传递给十进制将是无用的。如果你知道如何将十进制数转换为float,只需尝试将这些十六进制数转换为二进制数,并且一旦你有一个完整的二进制数(例如:0000 1111 0010 1101 1111 1110 0001 0010.将它作为一个字符串将有助于,但我不知道哪些函数或多少函数允许你使用二进制数)你只需要提取指数,符号和尾数。如果您不知道如何将整数转换为浮点数,请浏览互联网并为您选择最佳教程。请记住,一旦你将二进制数作为字符串,取标志,尾数和指数并不困难。如果你有某种将二进制转换为十进制的函数,你可以轻松地处理它。