2017-09-14 33 views
0

我試圖發送一個UDP通過使用Sendto函數,但首先我需要將它轉換爲char []的UDP winsock。嘗試多種方法後,最好的事情,我想出瞭如下:轉換double char chard數組中沒有填充

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

我的建議是,你只需在接收和發送端檢查sizeof double是8就可以用二進制格式發送它。 – NoSenseEtAl

+0

不要使用字符指針或字符數組,使用std :: string或可能使用std :: stringstream。 –

+2

@NoSenseEtAl二進制格式的浮點數並不總是可移植的。 – Galik

回答

3

你假設的二進制double佔用的字節數是相同的長度轉換的字符串佔用,但這不太可能。

如果你有C++11,你可以做這樣的事情:

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

否則,你可以做這樣的事情:

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