【问题标题】:Convert float data to Char data that has to be sent over UDP将浮点数据转换为必须通过 UDP 发送的 Char 数据
【发布时间】:2017-03-14 18:05:33
【问题描述】:

我正在使用 C 套接字将数据发送到服务器,我在互联网上找到了一些示例,但所有示例都显示了通过网络发送的 char 数据。 相反,我的数据是浮点数,所以我需要将这些数据从浮点数转换为字符来发送,而在服务器端我必须将其转换回浮点数。

我阅读了有关 sprintf 或 snprintf 的信息,但发现使用这些函数时存在一些问题。

我的情况:

packet[4] = {112.3, 113.4, 234.8, 599.4} “例如”

我需要将它作为字符发送到服务器。

提前致谢

【问题讨论】:

  • 你不能将memcpy() 的内容packet 传递给char buf[enoughLength],然后将buf 传递给send() 吗?
  • 这实际上是一个非常好的解决方案。 ;)

标签: c sockets type-conversion


【解决方案1】:

如果您小心的话,您可以使用union 将您的float 表示为chars 的数组:

typedef union packet
{
    float f;
    char c[4];
} packet;

除非字节序(您可能不得不旋转浮点数)和 char 在某些平台上签名而在其他平台上未签名(根据口味调整),这是明确定义的。特别是,该标准保证

  1. f的地址与c的第0个元素相同。

  2. c 数组是连续的。

【讨论】:

  • 是的,但是如果服务器在另一台机器上运行呢?地址不会一样!我的问题是我有两个外围设备,从一个我获得 4 个浮点值,从另一个 10 char 类型。所以我应该将 float 转换为 char 以将其发送到在另一台机器上运行的服务器,然后重新转换为所有变量的 float。
【解决方案2】:

我认为您对 char 缓冲区和 char 值感到困惑。 UDP 通信中的字符缓冲区,是承载数据信息所需的 8bit/1Byte 最小空间。这也等于 char 大小也是 8bit/1Byte。因此人们称它为 char 缓冲区。这并不意味着它们只能携带 char 值。

典型的浮点值长度为 4 字节,可以在 4 字节字符缓冲区中携带。请使用 memcpy 操作并将 float 变量的内容复制到 4Byte char 数组缓冲区中。在服务器中,基于源 IP,这个值可以很容易地从接收到的 char 数组缓冲区类型转换为浮点值(使用 atof)。

code snippet:
//At Tx - from client
float flt =xx.xx;
char charbuff[4] ={0};
memcpy(&charbuff,&flt,4);


//At Rx - in server
if(Rx done from specific IP which sends float value)
{
float rflt = (float)atof(buffer); //build in function available
}

【讨论】:

  • int main(void){ float value= 22.3;字符 valbuff[4]={0}; memcpy(&valbuff,&value,4);浮点值 = (float)atof(valbuff); printf("价值 %f",values);当我运行此代码时,输​​出值为 0.0000,我首先尝试使用示例程序,然后在 Socket 编程中使用它。
【解决方案3】:
int main(void)
{
    float value= 22.3;
    char valbuff[4]={0};
    memcpy(&valbuff,&value,4);
    float values = (float)atof(valbuff);
    printf("Valore %f ",values);
}

当我运行这段代码时,输​​出值为 0.0000,...

由于您刚刚将float value 复制到char valbuff[4],因此将值放回floatatof(valbuff) 非常不合适;你宁愿需要

    float values;
    memcpy(&values, valbuff, sizeof values);

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多