2017-05-24 12 views
-1

私はfloatをサーバに送信されるchar配列に変換しました。バッファー[10] ...からバッファー[20]に変換して、char配列を1つのfloatに変換できるようにしたいと思います。どのように私はこれを達成することができますか?私はatoiを使ってバッファ全体を変換する方法しか知りませんが、charバッファには他の無関係なデータが含まれているので、配列の特定の部分に対してこれをどうすれば選択できますか?どのようにchar配列のセクションをfloatに変換しますか?

これは私がchar配列に私のfloatを変換する方法です。

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の座標をサーバーにcharとして送信しています。

+1

あなたはすでにあなただけ後方に、文字列にフロートから行ってきました –

+0

同じ方法を試してみました何提示してください? –

+1

"floatをchar配列に変換しました" - どのように?それを行う方法は複数あります。 – Joni

答えて

0

strtod()が十分にある、floatatof()、またはより良いに文字列を変換します。

は、文字列に 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

2

コメントを読んで、おそらく何かしたいのは、何らかの形の通信媒体を介して生データとして送信できるように、データのシリアル化と逆シリアル化です。

そのため、ASCIIに変換する意味がありません。代わりに、最もコンパクトな生データフォーマットが必要になります。これは、両方のコンピュータが同じ浮動小数点形式と同じエンディアンを持つ場合に可能です。もしそうなら、あなたは単に行うことができます。

「bufは」あなたはを通してデータを受信/送信するために使用どんなデータバッファである
memcpy(buf, &my_float, sizeof(float)); // transmitter side 
memcpy(&my_float, buf, sizeof(float)); // receiver side 

関連する問題