转换double char chard数组中没有填充

问题描述:

我试图发送一个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

你假设的二进制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