关于字节序问题

  字节序分为主机字节序和网路字节序。

  主机字节序主要分为两种:大端字节序(big-endian)和小端字节序(little-endian)。不同的处理器架构,有不同的字节序。运行在同一台计算机上的进程相互通信时,一般不用考虑字节序问题。

  字节序是一个处理器架构特性,用于指示像整数这样的大数据类型的在内存中的内部字节顺序。

  大端字节序(big-endian),最高有效位(MSB, Most Significant Bit)存储在最低的内存地址处;(大端字节序最直观)

n n+1 n+2 n+3

 

MSB               LSB  

  小端字节序(little-endian),最低有效位(LSB,Least Significant Bit)存储在最低的内存地址处;(小端字节序最符合人正常逻辑思维)

 

n+3 n+2 n+1 n

 

MSB               LSB

  注意:1.不管字节如何排序,数字最高位总是在左边,最低位总是在右边;

     2.MSB(全大写)有时也指the Most Significant Byte,指多字节序列中具有最大权重的字节;

  例如:如果给定一个32位整数:0x04030201, 不管字节如何排序,数字最高位包含4,数字最低位包含1.

    如果将一个字符指针p强制转换到这个整数的地址,将会看到字节序带来的不同。

    (1)在小端字节序的处理器上,p[0]指向数字最低位1,p[3]指向数字最高位4;

    (2)在大端字节序的处理器上,p[0]指向数字最高位4,p[3]指向数字最低位1;

 

  网络字节序是网络协议指定的,根据协议,异构计算机系统之间可以交换信息而不会混淆字节序。

  根据TDP/IP协议栈,采用大端字节序。所以需要用到处理器字节序和网络字节序之间的转换。

  对于TCP/IP应用程序,有以下四个函数实现处理器字节序和网络字节序的转换:

    #include <arpa/inet.h>

    uint32_t htonl(uint32_t hostint32);

    uint16_t htons(uint16_t hostint16);

              返回以网络字节序表示的32位或16位整形数;

    uint32_t ntohl(uint32_t netint32);

    uint16_t ntohs(uint16_t netint16);

              返回以主机字节序表示的32位或16位整形数;

    注:h: host; n: network; l: long; s: short;

 

  判断一个机器是大序还是小序的

1 bool isBigEndian()
2 {
3     unsigned short test = 0x1122;
4     if(*((unsigned char*)&test) == 0x11)
5         return true;
6     else
7         return false;
8 }

注:程序忘记从哪个网站看的了,原创者可以联系我

 

 

 

  参考资料:UNIX环境高级编程

       维基百科:字节序:http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

       http://www.qqread.com/linux/2010/09/y495832.html

posted @ 2012-05-09 17:34  iavailable  阅读(289)  评论(0编辑  收藏  举报