大端&小端&网络序&主机序&比特序&位域

Little endian:  将低序字节存储在起始地址 
Big endian:     将高序字节存储在起始地址 

例子:在内存中双字0x01020304(DWORD)的存储方式 
内存地址(注:内存地址从左到右为由低到高)
    4000 4001 4002 4003 
LE  04   03   02   01     --- 符合人的思维,低值存放于低地址,高值存放于高地址
BE  01   02   03   04     --- 直观,数值阅读顺序与地址顺序一致,或者说在内存中填充的顺序与阅读的一致


可以通过以下小程序直接显示当前运行机器的字节序:

short  int  x;
char  x0;
x=0x1122;
x0=(( char *)&x)[0];
若x0=0x11,则是大端; 若x0=0x22,则是小端......


网络字节序为大端序,其实大端序或者网络序,我们可以当做一串字符串一样处理。例如 192.168.106.3

以下程序在x86平台执行结果为:

printf(“0x%x”, inet_addr("192.168.106.3"));

printf(“0x%x”, ntohl(inet_addr("192.168.106.3")));

printf(“0x%x”, htonl(inet_addr("192.168.106.3")));


0x36aa8c0

0xc0a86a3

0xc0a86a3


其实"192.168.106.3"就是一个字符串,在x86平台(小端序),是将字符串的低地址(左边为低)保存在低位,所以将192,即c0存放在低位,即在内存中保存的顺序为

内存:       低----->高

保存的值:    c0  a8  6a  3

转为int型,即为为0x36aa8c0;

ntohl会将整个顺序调换(小端序主机上),结果为0xc0a86a3;同时我们看到htonl实现其实和ntohl一样。


ntohs等函数为主机序与网络序转换的函数:
在使用little endian的系统中 这些函数会把字节序进行转换 
在使用big endian类型的系统中 这些函数会定义成空宏 


不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。 
处理器 操作系统 字节排序 
Alpha 全部 Little endian 
HP-PA NT Little endian 
HP-PA UNIX Big endian 
Intelx86 全部 Little endian <-----x86系统是小端字节序系统 
Motorola680x() 全部 Big endian 
MIPS NT Little endian 
MIPS UNIX Big endian 
PowerPC NT Little endian 
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统 
RS/6000 UNIX Big endian 
SPARC UNIX Big endian 
IXP1200 ARM核心 全部 Little endian


在定义协议报文,涉及到位域时,也需要区分大小端,如ip头version为高位,ihl为低位,则在小端情况下(低值在地址低位),version定义在后,而大端正好相反。

  1. struct iphdr 
  2.   { 
  3. #if __BYTE_ORDER == __LITTLE_ENDIAN 
  4.     unsigned int ihl:4; 
  5.     unsigned int version:4; 
  6. #elif __BYTE_ORDER == __BIG_ENDIAN 
  7.     unsigned int version:4; 
  8.     unsigned int ihl:4; 
  9. #else 
  10. # error "Please fix <bits/endian.h>" 
  11. #endif 
  12.     u_int8_t tos; 
  13.     u_int16_t tot_len; 
  14.     u_int16_t id; 
  15.     u_int16_t frag_off; 
  16.     u_int8_t ttl; 
  17.     u_int8_t protocol; 
  18.     u_int16_t check; 
  19.     u_int32_t saddr; 
  20.     u_int32_t daddr; 
  21.     /*The options start here. */ 
  22.   };





猜你喜欢

转载自blog.csdn.net/u014279330/article/details/78326723