主機字節序和網絡字節序

1       字節序
由於不同的計算機系統採用不同的字節序存儲數據,同樣一個4字節的32位整數,在內存中存儲的方式就不同. 字節序分爲小尾字節序(Little Endian)和大尾字節序(Big Endian), Intel處理器大多數使用小尾字節序, Motorola處理器大多數使用大尾(Big Endian)字節序;
小尾就是低位字節排放在內存的低端,高位字節排放在內存的高端。例如一個4字節的值爲0x1234567的整數與高低字節對應關係:
01
23
45
67
Byte3
Byte2
Byte1
Byte0
高位字節--à---------à--------------à低位字節
 
將在內存中按照如下順序排放:
內存地址序號
字節在內存中的地址
16進制值
0x03
Byte3
01
0x02
Byte2
23
0x01
Byte1
45
0x00
Byte0
67
 
 
大尾就是高位字節排放在內存的低端,低位字節排放在內存的高端。例如一個4字節的值爲0x1234567的整數與高低字節對應關係:
01
23
45
67
Byte3
Byte2
Byte1
Byte0
高位字節--à---------à--------------à低位字節
將在內存中按照如下順序排放:
內存地址序號
字節在內存中的地址
16進制值
0x03
Byte0
67
0x02
Byte1
45
0x01
Byte2
23
0x00
Byte3
01
 
2       網絡字節序
TCP/IP各層協議將字節序定義爲大尾,因此TCP/IP協議中使用的字節序通常稱之爲網絡字節序。
3       字串在內存中的存儲(intel系列)
    字串和整數是相反的,是安字串的索引從低到高存儲到內存中的;
     char s[4] = “abc”;  
a
b
c
/0
s[0]
s[1]
s[2]
s[3]
 
 
將在內存中按照如下順序排放:
內存地址序號
16進制值
指針P的位置
0xbffeadf7
/0
p+3
0xbffeadf6
c
p+2
0xbffeadf5
b
p+1
0xbffeadf4
a
p
 
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;
}
輸出結果:
[netcool@HFINMSP2 demo]$ ./demo001
bffeadf4,       bffeadf5,       bffeadf6,       bffeadf7
bffeadf4,       bffeadf5,       bffeadf6,       bffeadf7
a,      b,      c,
4       整數數組在內存中的存儲(intel系列)
同字串一樣,但是數組裏的每一個整數的存儲是按照小尾字節序;
 
5       linux系統中的處理方法
網絡字節序作爲一個標準字節序,如果系統並沒有提供相關的轉換函數,我們可以通過以下4個宏實現本地字節序和網絡字節序的相互轉換:
htons():將16位無符號整數從本地字節序轉換成網絡字節序
htonl():將32位無符號整數從本地字節序轉換成網絡字節序
ntohs():將16位無符號整數從網絡字節序轉換成本地字節序
ntohl():將32位無符號整數從網絡字節序轉換成本地字節序
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章