重新解释为 float 时可以指定字节序吗?

标签 c endianness modbus modbus-tcp

我正在编写一个通过 modbus TCP 进行通信的 C 程序。我在我的 modbus 客户端上发送 float 3.14,用 0x4048F5C3 的十六进制表示。我的 C 代码正确接收了 modbus 数据包,现在我只需要将 unsigned char *buffer 重新解释为 float ,这样我就可以获得值 3.14。这是我的代码

int main()
{
    setup_modbus_tcp();
    unsigned char buffer[4] = { 0x00, 0x00, 0x00, 0x00 };
    get_modbus_data(buffer, 4);
        //Buffer now holds { 0x40, 0x48, 0xF5, 0xC3 };
    float value = *(float *)buffer;
        //value is now -490.564453
}

现在,我可以说这个问题是字节顺序引起的,因为如果我交换字节顺序,缓冲区看起来像这样:

{ 0xC3, 0xF5, 0x48, 0x40 };

然后一切正常。但这感觉有点乱。我必须交换字节顺序吗?或者有没有一种方法可以在我这样做时指定字节序:

float value = *(float *)buffer;

最佳答案

缓冲区必须手动处理,这包括对字节顺序的更改。始终可以使用将缓冲区转换为浮点格式的函数。

float value = Convert( buffer );

补充一下,你转换缓冲区的方式不正确:

float value = *(float *)buffer;

无符号字符数组不能简单地为 float 类型,因为它会导致未定义的行为。必须将内存复制到 float 类型的对象:

float value;
memcpy( &value , buffer , sizeof( value ) );  //assumes endianness has already been handled

关于重新解释为 float 时可以指定字节序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36552769/

相关文章:

c - 线程和具有依赖关系的嵌套 for 循环(C 中的 pthreads)

c++ - 在编译时根据字节顺序定义位域

char* 十进制到小端十六进制

python - 连接 2 modbus slave pymodbus 时出错

C# Modbus/tcp - 挂起连接

字符串和数字的组合在c中无法正确比较

c - {} while(0) 在宏中如何工作?

c - 参数中的数组没有变量初始化

c++ - 大整数位旋转

embedded - 我对 Modbus 通信有点陌生,很难弄清楚在 "free modbus"的主机端使用哪些功能