在c ++中将double转换为char数组而不填充

时间:2017-09-14 19:14:57

标签: c++ arrays sockets double winsock

我正在尝试使用Sendto函数通过UDP winsock发送一个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 个答案:

答案 0 :(得分: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