如何将char数组的部分转换为float?

时间:2017-05-24 07:40:00

标签: c arrays floating-point char converter

我已将float转换为char数组,该数组将被发送到服务器。我希望能够转换char数组,比如从缓冲区[10] ...转换回缓冲区[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作为字符发送到服务器。

2 个答案:

答案 0 :(得分:2)

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

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

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

其中&#34; buf&#34;是用于通过发送/接收数据的任何数据缓冲区。

答案 1 :(得分:0)

要将字符串转换为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