我正在编写一个通过modbus TCP进行通信的C程序。我在我的modbus客户端上发送了浮点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;
答案 0 :(得分:2)
必须手动处理缓冲区,这包括对字节序的更改。始终可以使用将缓冲区转换为浮点格式的函数。
float value = Convert( buffer );
要添加,您转换缓冲区的方式不正确:
float value = *(float *)buffer;
无符号字符数组不能简单地为float
类型,因为它会导致未定义的行为。必须将内存复制到float
:
float value;
memcpy( &value , buffer , sizeof( value ) ); //assumes endianness has already been handled