【发布时间】:2015-07-30 20:47:33
【问题描述】:
我有这段遗留代码,我需要在 BIG 和 LITTLE Endian 机器上运行。问题出在 hton() 上。
msg->Mac 是字符 Mac[16+1] 现有代码:(仅适用于 BIG)
if (sscanf(msg->Mac, "%4hx.%4hx.%4hx", (unsigned short *)&new_mac[0],
(unsigned short *)&new_mac[2],
(unsigned short *)&new_mac[4]) != 3) {
return (ERROR_ADDRESS_TRANSLATION);
}
*(unsigned short *)&new_mac[0] = hton(*(unsigned short *)&new_mac[0]);
*(unsigned short *)&new_mac[2] = hton(*(unsigned short *)&new_mac[2]);
*(unsigned short *)&new_mac[4] = hton(*(unsigned short *)&new_mac[4]);
sprintf((char *)newMac, "%04x.%04x.%04x", *(unsigned short *)&new_mac[0],
*(unsigned short *)&new_mac[2], *(unsigned short *)&new_mac[4]);
/* Get the MAC address */
if (sscanf((char *)newMac, "%4hx.%4hx.%4hx", (unsigned short *)&mac_addr[0],
(unsigned short *)&mac_addr[2],
(unsigned short *)&mac_addr[4]) != 3) {
return (ERROR_ADDRESS_TRANSLATION);
}
/* Convert to network order */
*(unsigned short *)&mac_addr[0] = hton(*(unsigned short *)&mac_addr[0]);
*(unsigned short *)&mac_addr[2] = hton(*(unsigned short *)&mac_addr[2]);
*(unsigned short *)&mac_addr[4] = hton(*(unsigned short *)&mac_addr[4]);
为了在 LITTLE Endian 机器上解决这个问题,我使用了一个 SWAP 宏,它将在短时间内交换字节。这是正确的方法吗?
我在上面添加的代码:(使其也适用于 LITTLE)
#if __BYTE_ORDER != __BIG_ENDIAN
*(unsigned short *)&mac_addr[0] = SWAP(*(unsigned short *)&mac_addr[0]);
*(unsigned short *)&mac_addr[2] = SWAP(*(unsigned short *)&mac_addr[2]);
*(unsigned short *)&mac_addr[4] = SWAP(*(unsigned short *)&mac_addr[4]);
#endif
【问题讨论】:
-
msg->Mac 是字符 Mac[16+1]
-
你为什么交换?为什么直接打印,为什么不打印ntoh(new_mac[..])?
-
@WernerHenze 你的意思是我应该再次为 LITTLE 做 ntoh 吗?
-
是的。 sscanf 读取并存储主机字节顺序,然后您将 hton 用于网络字节顺序,然后将其打印出来。因此,如果您的主机字节顺序与网络字节顺序相同,则打印出您输入的内容。如果主机字节顺序不是网络字节顺序,则打印出交换的字节。解决方案不是交换,而是在打印前交换到 ntohs。请告诉我这是否回答了您的问题(我并不完全清楚),然后我可以将其写成您可以接受的答案。
标签: c++ endianness