我需要将网络字节顺序的结构s1复制到主机字节顺序的另一个结构s2
我看到下面两种方法给出了不同的输出。我认为方法2是正确的做法。
我说的对吗?如果是,我不明白为什么不同的输出。也许memcpy在这里扮演了一个角色?

struct abc
{

  int a;
  int b;
  int c;

} ;

struct abc  s1 = {0x58,0x20,0x30};
struct abc  s2;

方法1:
memcpy (&s2,&s2,sizeof(s1));
/* NOTE I read from s2 itself in ntohl */
s2.a= ntohl(s2.a);
s2.b= ntohl(s2.b);
s2.c= ntohl(s2.c);
printf("a %x b %x c %x\n",s2.a,s2.b,s2.c);

方法2:
/* read directly from s1 */
s2.a= ntohl(s1.a);
s2.b= ntohl(s1.b);
s2.c= ntohl(s1.c);
printf("a %x b %x c %x\n",s2.a,s2.b,s2.c);

最佳答案

应该是

memcpy (&s2,&s1,sizeof(abc));

而不是
memcpy (&s2,&s2,sizeof(s1));

但是考虑到abc是POD,我不认为使用memcpy有任何好处,除了它容易出错之外,您可以直接编写
s2 = s1;

取而代之的是(默认赋值运算符可以正常工作,因为abc中没有指针)。

关于c - memcpy和ntohl不同的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18831731/

10-13 03:36