Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字节数组拼接长/短的更好方法_C++_Casting_Short - Fatal编程技术网

C++ 从字节数组拼接长/短的更好方法

C++ 从字节数组拼接长/短的更好方法,c++,casting,short,C++,Casting,Short,因此,我在这里基于字节数组构造短/长,我希望避免使用memcpy将字节复制到它们自己的变量中,然后将该变量分配给对象中的sockaddr\u 是否有更好的方法提取以下语句中的short ((sockaddr_in*)from)->sin_port = (*((unsigned short*)&buf[4])); 我做了整个指针/取消引用的事情,因为如果我的逻辑正确,只做一个(unsigned short)buf[4]转换只能转换一个字节;不是两者都有 编辑:Endianness很

因此,我在这里基于字节数组构造短/长,我希望避免使用
memcpy
将字节复制到它们自己的变量中,然后将该变量分配给
对象中的
sockaddr\u

是否有更好的方法提取以下语句中的
short

((sockaddr_in*)from)->sin_port = (*((unsigned short*)&buf[4]));
我做了整个指针/取消引用的事情,因为如果我的逻辑正确,只做一个
(unsigned short)buf[4]
转换只能转换一个字节;不是两者都有


编辑:Endianness很好。我只希望buf[4]和buf[5]以一种简单的方式结合在一起,而不必使用
memcpy

您问题中的代码:

(*((unsigned short*)&buf[4]))
由于以下问题,可能无法工作:

如果您对endianness有信心,
memcpy
是安全的(如果没有,那么您应该结合
ntohs
ntohl
)。一个好的编译器也应该优化它

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


((buf[n]我认为在任何情况下,正确的解决方案都是使用
ntohs
htons
(对于
long
使用和
htonl

还要记住,根据字节数组的源,可能会遇到额外的Endianess问题


对齐可能是某些体系结构(HP-RISC、SPARC)上的另一个问题。函数
memcpy
memmove
通常没有这些问题。并且您不应该过早优化!

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

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

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

Endiannes很好-我已经测试过这一点(
memcpy
解决方案正在工作,但我正在尝试优化)你能详细介绍一下对齐/别名吗?@Di-0xide:alignment-可能
&buf[4]
的对齐方式不适合作为16位的量来读取。别名-编译器可以自由假设如何访问各种对象(也称为“别名”)在执行优化时,您的原始代码将违反这些假设。另外,感谢您的链接。“将变量从一种类型的指针解引用到另一种类型通常会违反严格的别名规则。”这也可能会受到对齐和别名问题的影响。
hton
/
ntohs
等只是为了修复尾端,如果我没有弄错的话。@Di-0xide:的确如此。奥利:我写了这个(当然不是别名问题)
((sockaddr_in*)from)->sin_port = htons(*((unsigned short*)&buf[4]));
((sockaddr_in*)from)->sin_port = htons(*((uint16_t*)&buf[4]));