首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当重新解释为浮动时,我可以指定endianness吗?

当重新解释为浮动时,我可以指定endianness吗?
EN

Stack Overflow用户
提问于 2016-04-11 15:19:17
回答 1查看 142关注 0票数 1

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

代码语言:javascript
复制
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,缓冲区看起来如下:

代码语言:javascript
复制
{ 0xC3, 0xF5, 0x48, 0x40 };

那一切都很好。但这感觉有点混乱。我必须要交换恩典吗?或者,当我这样做时,是否可以指定endianness:

代码语言:javascript
复制
float value = *(float *)buffer;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-11 15:23:17

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

代码语言:javascript
复制
float value = Convert( buffer );

要添加,转换缓冲区的方式是不正确的:

代码语言:javascript
复制
float value = *(float *)buffer;

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

代码语言:javascript
复制
float value;
memcpy( &value , buffer , sizeof( value ) );  //assumes endianness has already been handled
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36552769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档