本文共 1207 字,大约阅读时间需要 4 分钟。
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、DECARM既可以工作在大端,也可以工作在小端。
判断方法:
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#endif#ifdef WIN32#include #endif
参考链接:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html
参考链接:http://blog.csdn.net/ce123_zhouwei/article/details/6971544