1 字節(jié)序
由
于不同的計(jì)算機(jī)系統(tǒng)采用不同的字節(jié)序存儲數(shù)據(jù),同樣一個(gè)4字節(jié)的32位整數(shù),在內(nèi)存中存儲的方式就不同. 字節(jié)序分為小尾字節(jié)序(Little
Endian)和大尾字節(jié)序(Big Endian), Intel處理器大多數(shù)使用小尾字節(jié)序, Motorola處理器大多數(shù)使用大尾(Big
Endian)字節(jié)序;
小尾就是低位字節(jié)排放在內(nèi)存的低端,高位字節(jié)排放在內(nèi)存的高端。例如一個(gè)4字節(jié)的值為0x1234567的整數(shù)與高低字節(jié)對應(yīng)關(guān)系:
將在內(nèi)存中按照如下順序排放:
大尾就是高位字節(jié)排放在內(nèi)存的低端,低位字節(jié)排放在內(nèi)存的高端。例如一個(gè)4字節(jié)的值為0x1234567的整數(shù)與高低字節(jié)對應(yīng)關(guān)系:
將在內(nèi)存中按照如下順序排放:
2 網(wǎng)絡(luò)字節(jié)序
TCP/IP各層協(xié)議將字節(jié)序定義為大尾,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序。
3 字串在內(nèi)存中的存儲(intel系列)
字串和整數(shù)是相反的,是安字串的索引從低到高存儲到內(nèi)存中的;
char s[4] = “abc”;
將在內(nèi)存中按照如下順序排放:
int main(void)
{
char s[4] = "abc";
char *p = s;
printf("%02x, %02x, %02x, %02x/n", &s[0], &s[1], &s[2], &s[3]);
printf("%02x, %02x, %02x, %02x/n", p, p+1, p+2, p+3);
printf("%c, %c, %c, %c/n", s[0], s[1], s[2], s[3]);
return 0;
}
輸出結(jié)果:
[netcool@HFINMSP2 demo]$ ./demo001
bffeadf4, bffeadf5, bffeadf6, bffeadf7
bffeadf4, bffeadf5, bffeadf6, bffeadf7
a, b, c,
4 整數(shù)數(shù)組在內(nèi)存中的存儲(intel系列)
同字串一樣,但是數(shù)組里的每一個(gè)整數(shù)的存儲是按照小尾字節(jié)序;
5 linux系統(tǒng)中的處理方法
網(wǎng)絡(luò)字節(jié)序作為一個(gè)標(biāo)準(zhǔn)字節(jié)序,如果系統(tǒng)并沒有提供相關(guān)的轉(zhuǎn)換函數(shù),我們可以通過以下4個(gè)宏實(shí)現(xiàn)本地字節(jié)序和網(wǎng)絡(luò)字節(jié)序的相互轉(zhuǎn)換:
htons():將16位無符號整數(shù)從本地字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序
htonl():將32位無符號整數(shù)從本地字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序
ntohs():將16位無符號整數(shù)從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成本地字節(jié)序
ntohl():將32位無符號整數(shù)從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成本地字節(jié)序
|
|