- 大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中(TCP/IP协议规定了在网络上必须采用大端模式)
- 小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中;0x22放在高地址中,即0x0011中。小端模式,刚好相反
一个判断当前系统是大端还是小端的函数,小端则返回1:
int checkCPU()
{
union w
{
int a;
Byte b[4];
} c;
c.a = 1;
return(c.b[0] ==1);
}
以上函数,若在小端系统下,其字节序为,b[0]中存储00000001,后三个字节依次存储00000000,大端系统下反之
在iOS开发中,苹果已经为我们定义好了一套用于大小端转换的宏定义:
#defineNTOHL(x)(x) = ntohl((__uint32_t)x)
#defineNTOHS(x)(x) = ntohs((__uint16_t)x)
#defineNTOHLL(x)(x) = ntohll((__uint64_t)x)
#defineHTONL(x)(x) = htonl((__uint32_t)x)
#defineHTONS(x)(x) = htons((__uint16_t)x)
#defineHTONLL(x)(x) = htonll((__uint64_t)x)
NTOHL,network to host,L、S、LL分别对应long、short、long long
HTONL,反之
大小端转换原理如下:
假设一个short类型的数字:0x1122,那么其二进制形式为:00010001 00100010
首先,取出第一个字节,右移八位:
00010001 00100010
& 11111111 00000000
= 00010001 00000000
>>8 00000000 00010001
然后,取出第二个字节,左移八位:
00010001 00100010
& 00000000 11111111
= 00000000 00100010
<<8 00100010 00000000
最后,按位或,至此,大小端转换完成:
00000000 00010001
|| 00100010 00000000
== 00100010 00010001