当前位置: 技术问答>linux和unix
字节序的问题
来源: 互联网 发布时间:2015-11-14
本文导语: 看了网上流传甚广的一个自己写的ping程序,看到下面的语句,不解: /*校验和算法*/ unsigned short cal_chksum(unsigned short *addr,int len) { int nleft=len; int sum=0; unsigned short *w=addr; unsigned short answer=0; /*把ICMP报头二进制数...
看了网上流传甚广的一个自己写的ping程序,看到下面的语句,不解:
/*校验和算法*/
unsigned short cal_chksum(unsigned short *addr,int len)
{ int nleft=len;
int sum=0;
unsigned short *w=addr;
unsigned short answer=0;
/*把ICMP报头二进制数据以2字节为单位累加起来*/
while(nleft>1)
{ sum+=*w++;
nleft-=2;
}
/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/
if( nleft==1)
{ *(unsigned char *)(&answer)=*(unsigned char *)w;
//ok,这里就是不明白的地方,这样我发现只是把最后一个字节放到路一个short型的低位而不是高位,实验证明也是如此,是不是作者错了?????????????????
sum+=answer;
}
/*校验和算法*/
unsigned short cal_chksum(unsigned short *addr,int len)
{ int nleft=len;
int sum=0;
unsigned short *w=addr;
unsigned short answer=0;
/*把ICMP报头二进制数据以2字节为单位累加起来*/
while(nleft>1)
{ sum+=*w++;
nleft-=2;
}
/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/
if( nleft==1)
{ *(unsigned char *)(&answer)=*(unsigned char *)w;
//ok,这里就是不明白的地方,这样我发现只是把最后一个字节放到路一个short型的低位而不是高位,实验证明也是如此,是不是作者错了?????????????????
sum+=answer;
}
|
不同系统的字节顺序是不同的,有的是大端顺序,有的是小端顺序,所以一般要用系统函数来转换。
|
不同平台是用大端 还是小端存储字节都是不一样的