一、概念:
不同的CPU有不同的字节序类型,指在内存中的保存顺序。
常见的有两种:
1.Little-endian: 将低序字节存储在起始地址(低位编码,低位开始);
2.Big-endian: 将高序字节存储在起始位置(高位编码,高位开始);
LE(little-endian):
符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
BE(big-endian):
直观的字节序
地址低位存储值的高位
地址高位存储值得低位
二、例子:
0x01020304 (DWORD)在内存地址4000 4001 4002 4003的存储方式:
内存地址: 4000 4001 4002 4003
LE: 04 03 02 01
BE: 01 02 03 04
注:每个地址存1个字节,每个字有4个字节。2位16进制数是1个字节(0xFF = 1111 1111)
三、注意:
1.x86系列的CPU都是little-endian的字节序;
2.一般操作系统都是小端,而通信协议是大端的;
3.创建CPU的字节序:
Big-Endian: PowerPC、IBM、Sun
Little-Endian:x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。
4.常见的文件的字节序:
Adobe PS : Big Endian
BMP: Little Endian
DXF(AutoCAD):Variable
GIF:Little Endian
JPEG:Little Endian
MacPaint: Big Endian
RTF:Little Endian
四、工具:
1.判断机器的字节序:
BOOL isBigEndian()
{
int a = 0x1234;
// 通过将int强制类型转换成char单字节,通过判断其实存储位置
char b = *(char *)&a;
if (b == 0x12) {
return YES;
}
return NO;
}
2.联合体 union的存放顺序死所有的成员都从地地址开始存放,利用该特性就可以轻松获得CPU对内存采用的Little-endian还是Big-endian模式读写:
BOO isBigEndian()
{
union NUM
{
int a;
char b;
} num;
num.a = 0x1234;
if (num.b == 0x12) {
return YES;
}
return NO;
}
/**
* @brief 64位数据高度和低地址的交换
*
* @param A 值
*
* @return 返回结果
*/
#define BigSwapLittle64(A) ((((uint64)(A) & 0xff00000000000000) >> 56) | \
(((uint64)(A) & 0x00ff000000000000) >> 40) | \
(((uint64)(A) & 0x0000ff0000000000) >> 24) | \
(((uint64)(A) & 0x000000ff00000000) >> 8) | \
(((uint64)(A) & 0x00000000ff000000) << 8) | \
(((uint64)(A) & 0x0000000000ff0000) << 24) | \
(((uint64)(A) & 0x000000000000ff00) << 40) | \
(((uint64)(A) & 0x00000000000000ff) << 56))
/**
* @brief 32位数据高度和低地址的交换
*
* @param A 值
*
* @return 返回结果
*/
#define BigSwapLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) | \
(((uint32)(A) & 0x00ff0000) >> 8) | \
(((uint32)(A) & 0x0000ff00) << 8) | \
(((uint32)(A) & 0x000000ff) << 24))
/**
* @brief 16位数据高度和低地址的交换
*
* @param A 值
*
* @return 返回结果
*/
#define BigSwapLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | \
(((uint16)(A) & 0x00ff) << 8))
五、备注参考:
1.http://www.cnblogs.com/passingcloudss/archive/2011/05/03/2035273.html
2.http://blog.csdn.net/goldfighter/article/details/8289215
六、资料下载:
1.iOS 网络编程,client 与 server 大小端格式问题,Objective-C语言工具一份: 自定义的父类2.文档:iOS 大端格式和小段格式