2017-09-14 13 views
0

Sendto関数を使用してUDP winsockでダブルを送信しようとしていますが、まずchar []に変換する必要があります。複数のアプローチを試した後、私が思いついた最高のものは以下の通りです:C++で埋め尽くさないようにdouble型のchar配列に変換する

// send 
    memset(buf, '\0', BUFLEN); 
    double a = position.y(); 
    char arr[sizeof(a)]; 
    cout << "double" << a << endl; 
    ToString(arr, sizeof(a), a); 

    sendto(s, arr, strlen(arr), 0, (struct sockaddr *) &si_other, slen); 
    cout << "Send" << arr << endl; 

これは残念ながら、送信操作を遺跡奇妙な末尾のパディングを提供します。どのようにこれを解決するための任意のアイデアですか?

マイToString関数は以下の通りです:

void ToString(char * outStr, int length, double val) 
{ 
    _snprintf(outStr, length, "%f", val); 
} 

出力は次のようになります。

double 0.003 
Send 0.003(a bunch of gibberish) 
+1

私の提案は、ということです参照してください:

void send_double(int s, sockaddr* si_other, int slen, double d) { auto buf = std::to_string(d); sendto(s, buf.data(), buf.size(), 0, si_other, slen); } 

は、そうしないと、このような何かを行うことができます受信側と送信側の両方でsizeof doubleが8であることを確認してバイナリ形式で送信するだけです。 – NoSenseEtAl

+0

文字ポインタまたはcharの配列を使用しないでください。std :: stringとおそらくはstd :: stringstreamを使用してください。 –

+2

@NoSenseEtAlバイナリ形式の浮動小数点は、常にポータブルであるとは限りません。 – Galik

答えて

3

あなたはバイナリdoubleが占有するバイト数と同じ長さであると仮定されています変換された文字列は占有していますが、それはそうではありません。あなたはC++11を持っている場合は

あなたはこのような何かを行うことができます。

void send_double(int s, sockaddr* si_other, int slen, double d) 
{ 
    std::ostringstream oss; 
    oss << d; 
    std::string buf = oss.str(); 
    sendto(s, buf.data(), buf.size(), 0, si_other, slen); 
} 

std::stringstd::to_stringstd::ostringstream

関連する問題