ntohl默认是转换32位字节序的数据,也就是说默认是转换float类型的数据;ntohl进行转换。需要自己编写一个函数做这个转换,以下是一种方式:
double ntohd(double netDouble)
{
uint64_t netInt = be64toh(*((uint64_t*)&netDouble));
return *((double*)&netInt);
}
逐行解析一下:
uint64_t netInt = be64toh(*((uint64_t*)&netDouble));
这句话做了:
&netDouble: 获取 netDouble 的内存地址。(uint64_t*)&netDouble: 将该地址强制转换为 uint64_t 类型的指针。这是为了将双精度浮点数的内存表示视为一个64位的无符号整数。*((uint64_t*)&netDouble): 通过解引用这个指针,我们得到了一个 uint64_t 类型的值,该值在内存中的表示与 netDouble 完全相同。be64toh(...): 这是一个库函数,用于将64位的无符号整数从网络字节序(big-endian)转换为主机字节序。return *((double*)&netInt);
同理,这句话:
&netInt: 获取 netInt 的内存地址。
(double*)&netInt: 将该地址强制转换为 double 类型的指针。这是为了将64位的无符号整数的内存表示视为一个双精度浮点数。
*((double*)&netInt): 通过解引用这个指针,我们得到了一个 double 类型的值,该值在内存中的表示与 netInt 完全相同。
最后,这个值被返回。
double x, y, z, rx, ry, rz;
char data[1140];
int recvLen = recv(socket_, data, 1140, 0);
if (recvLen > 0)
{
memcpy(&x, data+444, sizeof(double));
memcpy(&y, data+452, sizeof(double));
memcpy(&z, data+460, sizeof(double));
memcpy(&rx, data+468, sizeof(double));
memcpy(&ry, data+476, sizeof(double));
memcpy(&rz, data+484, sizeof(double));
x = ntohd(x);
y = ntohd(y);
z = ntohd(z);
rx = ntohd(rx);
ry = ntohd(ry);
rz = ntohd(rz);
ntohd换成dtohl会解析出全是0的错误数据。