转换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)
答
你假设的二进制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);
}
我的建议是,你只需在接收和发送端检查sizeof double是8就可以用二进制格式发送它。 – NoSenseEtAl
不要使用字符指针或字符数组,使用std :: string或可能使用std :: stringstream。 –
@NoSenseEtAl二进制格式的浮点数并不总是可移植的。 – Galik