1.字节序
简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。也就是说,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的Intel x86系列就是小端序。
2.大端(Big-Endian)
数据高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
3.小端(Little-Endian)
数据低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
4.举例
假设一个32位 unsigned int型数据0x12 34 56 78,大小端8位存储方式如下:
低地址 —————–> 高地址
大端存储方式为0x12 34 56 78
低地址 —————–> 高地址
小端存储方式为0x78 56 34 12
假设从内存地址0x4000开始存放,结果如下图所示。
一个很好的记忆方法是,大端字节序是按照数据的书写顺序进行存储,而小端字节序是颠倒书写顺序进行存储。
5.常见CPU的字节序
大端: PowerPC、IBM、Sun
小端: x86、DEC
ARM既可以工作在大端,也可以工作在小端。
判断方法:
bool IsBigEndian()
{
int a = 0x1234;
//通过将int强制类型转换成char单字节,相当于取b等于a的低地址部分
char b = *(char *)&a;
if( b == 0x12)
{
return true;
}
return false;
}
6.网络字节序
所有的网络通讯协议都是使用大端字节序的编码。
C/C++中有如下四个常用的转换函数,这四个函数在小端系统中生效,大端系统由于和网络字节序相同,所以无需转换。
htons—把unsigned short类型从主机序转成网络字节序
ntohs—把unsigned short类型从网络字节序转成主机序
htonl—把unsigned long类型从主机序转成网络字节序
ntohl—把unsigned long类型从网络字节序转成主机序
使用以上函数需包含头文件:
#if defined(_LINUX) || defined(_DARWIN)
#include <netinet/in.h>
#endif
#ifdef WIN32
#include <WINSOCK2.H>
#endif
参考链接:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html
参考链接:http://blog.youkuaiyun.com/ce123_zhouwei/article/details/6971544