在C ++中将double转换为char数组而不进行填充
Convert double to char array without padding in c++
我正在尝试使用 Sendto 函数通过 UDP winsock 发送双精度数,但首先我需要将其转换为 char[]。在尝试了多种方法之后,我想到的最好的方法如下:
// send
memset(buf, '[=10=]', 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);
}
我正在尝试使用 Sendto 函数通过 UDP winsock 发送双精度数,但首先我需要将其转换为 char[]。在尝试了多种方法之后,我想到的最好的方法如下:
// send
memset(buf, '[=10=]', 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);
}