自建网站需要哪些技术,东莞网站优化哪个公司好,网站后台使用培训,中企动力科技股份有限公司常州分公司坑的由来
都知道在网络通信时要把网络字节序转化为主机字节序才行#xff0c;但是c里的标准库函数ntohl默认是转换32位字节序的数据#xff0c;也就是说默认是转换float类型的数据#xff1b;而ur机械臂30003端口发送的是double类型的数据#xff0c;没法直接用ntohl进行转…坑的由来
都知道在网络通信时要把网络字节序转化为主机字节序才行但是c里的标准库函数ntohl默认是转换32位字节序的数据也就是说默认是转换float类型的数据而ur机械臂30003端口发送的是double类型的数据没法直接用ntohl进行转换。
小贴士
float是4字节32位double是8字节64位。在网络传输中数据通常以字节为单位进行编码这种编码方式被称为网络字节序它主要用于确保数据在不同主机之间传输时不会受到主机不同字节序的影响。网络字节序采用大端模式即高位字节在前低位字节在后。而主机字节序则可能因主机的不同而有所差异常见的有两种大端模式和小端模式。小端模式的主机字节序低位字节在前高位字节在后与人的直观感受相符。
解决办法
需要自己编写一个函数做这个转换以下是一种方式
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 完全相同。 最后这个值被返回。
附录ur机械臂30003端口机械臂法兰位姿数据解析
double x, y, z, rx, ry, rz;char data[1140];int recvLen recv(socket_, data, 1140, 0);if (recvLen 0) {memcpy(x, data444, sizeof(double));memcpy(y, data452, sizeof(double));memcpy(z, data460, sizeof(double));memcpy(rx, data468, sizeof(double));memcpy(ry, data476, sizeof(double));memcpy(rz, data484, sizeof(double));x ntohd(x);y ntohd(y);z ntohd(z);rx ntohd(rx);ry ntohd(ry);rz ntohd(rz);
上面的代码就是对ur机械臂30003端口机械臂法兰位姿的解析如果将ntohd换成dtohl会解析出全是0的错误数据。