关于字节序问题
字节序分为主机字节序和网路字节序。
主机字节序主要分为两种:大端字节序(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