将 2 uint16_t 转换为 32-float IEEE-754 格式
Converting 2 uint16_t to 32-float IEEE-754 fomat
我有一个 modbus 设备,它以 IEEE754 格式保存 32 位浮点值。
在当然使用 C 的 arduino 中,我可以检索那些分成两个 16 位值的值,这些值在 uint16_t 值中返回。 (来自 modbus 设备的每个寄存器都有 16 位,所以值被分成两个寄存器,但是我使用的库 returns uint16_t)。
我现在想弄清楚如何将这两个 uint16_t 转换成 1 个 32 位浮点数,我想得到一些帮助,因为我一直不知道如何将它转换成这个值的类型。
在此先感谢您的帮助。
编辑:
为了澄清,这是一张格式图片
绕过 strict aliasing or invalid type-punning is really through the use of std::memcpy
的唯一方法:
uint16_t const value[2] = { low_word, high_word }; // Assuming little-endianness
float f;
std::memcpy(reinterpret_cast<void*>(&f), reinterpret_cast<void const*>(value), sizeof f);
我有一个 modbus 设备,它以 IEEE754 格式保存 32 位浮点值。 在当然使用 C 的 arduino 中,我可以检索那些分成两个 16 位值的值,这些值在 uint16_t 值中返回。 (来自 modbus 设备的每个寄存器都有 16 位,所以值被分成两个寄存器,但是我使用的库 returns uint16_t)。
我现在想弄清楚如何将这两个 uint16_t 转换成 1 个 32 位浮点数,我想得到一些帮助,因为我一直不知道如何将它转换成这个值的类型。
在此先感谢您的帮助。
编辑:
为了澄清,这是一张格式图片
绕过 strict aliasing or invalid type-punning is really through the use of std::memcpy
的唯一方法:
uint16_t const value[2] = { low_word, high_word }; // Assuming little-endianness
float f;
std::memcpy(reinterpret_cast<void*>(&f), reinterpret_cast<void const*>(value), sizeof f);