- 大端模式(Big-endian)致稀,是指數(shù)據(jù)的高字節(jié)岩馍,保存在內(nèi)存的低地址中鳖目,而數(shù)據(jù)的低字節(jié)仪媒,保存在內(nèi)存的高地址中(TCP/IP協(xié)議規(guī)定了在網(wǎng)絡(luò)上必須采用大端模式)
- 小端模式(Little-endian)狸眼,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中藤树,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中
例如一個16bit的short型x,在內(nèi)存中的地址為0x0010份企,x的值為0x1122也榄,那么0x11為高字節(jié),0x22為低字節(jié)。對于大端模式甜紫,就將0x11放在低地址中降宅,即0x0010中;0x22放在高地址中囚霸,即0x0011中腰根。小端模式,剛好相反
一個判斷當(dāng)前系統(tǒng)是大端還是小端的函數(shù)拓型,小端則返回1:
int checkCPU()
{
union w
{
int a;
Byte b[4];
} c;
c.a = 1;
return(c.b[0] ==1);
}
以上函數(shù)额嘿,若在小端系統(tǒng)下,其字節(jié)序為劣挫,b[0]中存儲00000001册养,后三個字節(jié)依次存儲00000000,大端系統(tǒng)下反之
在iOS開發(fā)中压固,蘋果已經(jīng)為我們定義好了一套用于大小端轉(zhuǎn)換的宏定義:
#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分別對應(yīng)long、short拦键、long long
HTONL谣光,反之
大小端轉(zhuǎn)換原理如下:
假設(shè)一個short類型的數(shù)字:0x1122,那么其二進制形式為:00010001 00100010
首先芬为,取出第一個字節(jié)萄金,右移八位:
00010001 00100010
& 11111111 00000000
= 00010001 00000000
>>8 00000000 00010001
然后,取出第二個字節(jié)碳柱,左移八位:
00010001 00100010
& 00000000 11111111
= 00000000 00100010
<<8 00100010 00000000
最后捡絮,按位或,至此莲镣,大小端轉(zhuǎn)換完成:
00000000 00010001
|| 00100010 00000000
== 00100010 00010001