如何将 char 数组的部分转换为 float?
How do you convert sections of char array into float?
我已将浮点数转换为将发送到服务器的字符数组。我希望能够转换 char 数组,比如从缓冲区 [10]... 到缓冲区 [20] 转换回单个浮点数。我怎样才能做到这一点?我只知道如何使用 atoi 转换整个缓冲区,但由于我的 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 坐标作为字符发送到服务器。
阅读评论,您可能想要做的是对数据进行序列化和反序列化,以便它可以作为原始数据通过某种形式的通信媒体发送。
为此,转换为 ASCII 没有任何意义。相反,您需要一种最紧凑的原始数据格式。如果两台计算机具有相同的浮点格式和相同的字节序,则这是可能的。如果是这样,你可以简单地做:
memcpy(buf, &my_float, sizeof(float)); // transmitter side
memcpy(&my_float, buf, sizeof(float)); // receiver side
其中 "buf" 是您用来 send/receive 数据的任何数据缓冲区。
要将 字符串 转换为 float
、atof()
或更好,strtod()
就足够了。
要将 float
转换为字符串,代码需要确保使用足够的精度和足够大的缓冲区来保存和区分所有 float
- 大约 17 char
。最好使用一些指数格式,如 "%e"
或 "%a"
.
// - dig . digs e - expo [=10=]
#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
我已将浮点数转换为将发送到服务器的字符数组。我希望能够转换 char 数组,比如从缓冲区 [10]... 到缓冲区 [20] 转换回单个浮点数。我怎样才能做到这一点?我只知道如何使用 atoi 转换整个缓冲区,但由于我的 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 坐标作为字符发送到服务器。
阅读评论,您可能想要做的是对数据进行序列化和反序列化,以便它可以作为原始数据通过某种形式的通信媒体发送。
为此,转换为 ASCII 没有任何意义。相反,您需要一种最紧凑的原始数据格式。如果两台计算机具有相同的浮点格式和相同的字节序,则这是可能的。如果是这样,你可以简单地做:
memcpy(buf, &my_float, sizeof(float)); // transmitter side
memcpy(&my_float, buf, sizeof(float)); // receiver side
其中 "buf" 是您用来 send/receive 数据的任何数据缓冲区。
要将 字符串 转换为 float
、atof()
或更好,strtod()
就足够了。
要将 float
转换为字符串,代码需要确保使用足够的精度和足够大的缓冲区来保存和区分所有 float
- 大约 17 char
。最好使用一些指数格式,如 "%e"
或 "%a"
.
// - dig . digs e - expo [=10=]
#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