2017-09-14 3 views
0

Ich versuche, ein Double über eine UDP Winsock mit der Sendto-Funktion zu senden, aber zuerst muss ich es in eine Char [] konvertieren. mehrere Ansätze Nach dem Versuch, das Beste, was kam ich mit ist die folgende:Konvertieren Double in Char-Array ohne Auffüllung in C++

// 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; 

Dies gibt leider eine seltsame Hinter Polsterung aus, dass die Sendeoperation ruiniert. Irgendwelche Ideen, wie man das löst?

Meine ToString Funktion ist die folgende:

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

Die Ausgabe sieht wie folgt aus:

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

mein Vorschlag ist, dass Sie überprüfen einfach, dass sizeof double 8 sowohl auf der Empfangs- als auch auf der Sendeseite ist und senden Sie sie einfach im Binärformat. – NoSenseEtAl

+0

Verwenden Sie keine Zeichenzeiger oder Arrays von Zeichen, verwenden Sie std :: string und möglicherweise std :: stringstream. –

+2

@NoSenseEtAl Binärformatschwimmer sind nicht immer übertragbar. – Galik

Antwort

3

Sie gehen davon aus, dass die Anzahl von Bytes, die die binäre double einnimmt, ist die gleiche Länge wie die konvertierte Zeichenfolge belegt, aber das ist unwahrscheinlich.

Wenn Sie C++11 haben, können Sie etwas tun:

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); 
} 

Ansonsten können Sie etwas tun:

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); 
} 

Siehe std::string, std::to_string und std::ostringstream

Verwandte Themen