我正在编写一个通过modbus TCP进行通信的C程序。我在modbus客户端上发送浮动3.14,并使用0x4048F5C3的十六进制表示形式。我的C代码正确地接收了modbus包,现在我只需要将unsigned char *buffer重新解释为浮点数,这样我就可以得到值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
}现在,我可以看出这个问题是因为endianness,因为如果我交换endianness,缓冲区看起来如下:
{ 0xC3, 0xF5, 0x48, 0x40 };那一切都很好。但这感觉有点混乱。我必须要交换恩典吗?或者,当我这样做时,是否可以指定endianness:
float value = *(float *)buffer;发布于 2016-04-11 15:23:17
必须手动处理缓冲区,这包括对endianness的更改。可以始终使用将缓冲区转换为浮点格式的函数。
float value = Convert( buffer );要添加,转换缓冲区的方式是不正确的:
float value = *(float *)buffer;无符号字符数组不能简单地转换为float类型,因为它会导致未定义的行为。必须将内存复制到float类型的对象。
float value;
memcpy( &value , buffer , sizeof( value ) ); //assumes endianness has already been handledhttps://stackoverflow.com/questions/36552769
复制相似问题