1

所以我在这里基于字节数组构建shorts/longs,我想避免使用memcpy将字节复制到他们自己的变量中,然后将该变量分配给一个sockaddr_in对象。

有没有更好的方法来提取short以下语句中的内容?:

((sockaddr_in*)from)->sin_port = (*((unsigned short*)&buf[4]));

我做了整个指针/取消引用的事情,因为如果我的逻辑是正确的,那么只做一个(unsigned short)buf[4]转换只会转换一个字节;不是都。

编辑:字节序很好。除了必须使用memcpy.

4

3 回答 3

2

您问题中的代码:

(*((unsigned short*)&buf[4]))

由于以下问题,可能无法正常工作:

memcpy如果您对字节序有信心(如果没有,那么您应该与ntohsor结合使用ntohl)是安全的。一个体面的编译器也应该优化它。

如果你真的想避免memcpy,那么一种安全的、独立于平台的方式如下所示(假设buf最初是从外部源填充的,使用标准网络字节顺序):

((buf[n] << 8) | buf[n+1])

当然,您应该将其包装在一个函数(或宏,如果必须的话)中。

于 2012-05-16T23:43:29.687 回答
1

我认为正确的解决方案在任何情况下都是使用ntohshtons(用于long使用ntohlhtonl)之类的功能。

((sockaddr_in*)from)->sin_port = htons(*((unsigned short*)&buf[4]));

另请记住,根据字节数组的来源,您可能会遇到其他 Endianess 问题。

在某些体系结构(HP-RISC、SPARC)上,对齐可能是另一个问题。这些功能通常没有这些问题memcpy而且你不应该过早地优化!memmove

于 2012-05-16T23:47:46.680 回答
0

您可以使用 ntohs 宏来处理字节序转换,htons 表示主机到网络的顺序

((sockaddr_in*)from)->sin_port = htons(*((uint16_t*)&buf[4]));

请注意,但是某些架构不允许未对齐的访问,因此您需要确保它是对齐的,或者您可能需要将对齐的字节提取到临时变量中并相应地打乱位。

于 2012-05-16T23:52:47.350 回答