【问题标题】:How do you convert sections of char array into float?如何将 char 数组的部分转换为浮点数?
【发布时间】:2017-10-24 10:04:05
【问题描述】:

我已将浮点数转换为将发送到服务器的 char 数组。我希望能够转换 char 数组,例如从 buffer[10]... 到 buffer [20] 转换回单个浮点数。我怎样才能做到这一点?我只知道如何使用 atoi 转换整个缓冲区,但由于我的 char 缓冲区将包含其他不相关的数据,我该如何选择性地为我的数组的某些部分执行此操作?

这就是我将浮点数转换为 char 数组的方式。

  sprintf(game->buffer,"%f",game->man[playerNumber-48].x);

    //printf("%s\n", game->buffer);

    for(int i = 0; i<11;i++)
    {
        game->send_key_to_server[i+8] = game->buffer[i];
    }

    sprintf(game->buffer,"%f",game->man[playerNumber-48].y);

    for(int i = 0; i<11;i++)
    {
        game->send_key_to_server[i+19] = game->buffer[i];
    }

基本上我将我的玩家 x 和 y 坐标作为字符发送到服务器。

【问题讨论】:

  • 请展示您已经尝试过的内容
  • 与从浮动到字符串的方式相同,只是向后?
  • “将浮点数转换为字符数组” - 怎么样?不止一种方法来做到这一点
  • 不仅需要查看您尝试了什么,还需要查看您如何从 float 到此数组,因为这将决定您如何返回。
  • 所以你想使用 sprintf 从 float 转到 ascii 然后使用 scanf 从 ascii 转到 float。

标签: c arrays floating-point char converter


【解决方案1】:

读取 cmets,您可能想要做的是对数据进行序列化和反序列化,以便可以通过某种形式的通信媒体将其作为原始数据发送。

为此,转换为 ASCII 没有任何意义。相反,您需要一种最紧凑的原始数据格式。如果两台计算机具有相同的浮点格式和相同的字节序,这是可能的。如果是这样,您可以这样做:

memcpy(buf, &my_float, sizeof(float)); // transmitter side
memcpy(&my_float, buf, sizeof(float)); // receiver side

其中“buf”是您用来发送/接收数据的任何数据缓冲区。

【讨论】:

    【解决方案2】:

    要将字符串 转换为floatatof() 或更好,strtod() 就足够了。

    要将float 转换为字符串,代码需要确保使用足够的精度和足够大的缓冲区来保存和区分所有float - 大约17 个char。最好使用一些指数格式,例如 "%e""%a"

    //                    -  dig  .     digs               e   -  expo \0
    #define FLT_STR_SIZE (1 + 1 + 1 + (FLT_DECIMAL_DIG-1) + 1 + 1 + 3 + 1)
    char s[FLT_STR_SIZE];
    sprintf(s, "%.*e", FLT_DECIMAL_DIG-1, some_float);
    

    Details

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 2011-02-28
      • 2019-01-06
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多