1. 程式人生 > >大端 小端和網絡字節序說明

大端 小端和網絡字節序說明

body 地址 eve powerpc tcp ron 轉換成 字節流 n)

不同CPU存放數據有大端(Big-Endian)和小端(little-Endian)之分
小端字節序和大端字節序表示存儲的字節順序有區別
小端字節序:低字節存於內存低地址;高字節存於內存高地址;
long型數據0x12345678
在小端系統中,

地址 數據
0x00000100 0x78
0x00000101 0x56
0x00000102 0x34
0x00000103 0x12

內存的地址是由低到高的順序;而數據的字節也是由低到高的

大端字節序:高字節存於內存低地址;低字節存於內存高地址;
long型數據0x12345678
在大端系統中,

地址 數據
0x00000100 0x12
0x00000101 0x34
0x00000102 0x56
0x00000103 0x78

內存的地址是由低到高的順序;而數據的字節卻是由高到低的

網絡字節序
網絡上傳輸的數據都是字節流,對於一個多字節數值,在進行網絡傳輸的時候,先傳遞哪個字節?也就是說,當接收端收到第一個字節的時候,它將這個字節作為高位字節還是低位字節處理,是一個比較有意義的問題;
UDP/TCP/IP協議規定:把接收到的第一個字節當作高位字節看待,這就要求發送端發送的第一個字節是高位字節;而在發送端發送數據時,發送的第一個字節是該數值在內存中的起始地址處對應的那個字節,也就是說,該數值在內存中的起始地址處對應的那個字節就是要發送的第一個高位字節(即:高位字節存放在低地址處);由此可見,多字節數值在發送之前,在內存中因該是以大端法存放的;

所以說,網絡字節序是大端字節序;比如,我們經過網絡發送整型數值0x12345678時,在80X86平臺中,它是以小端發存放的,在發送之前需要使用系統提供的字節序轉換函數htonl()將其轉換成大端法存放的數值;

常見CPU的字節序
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。

大端 小端和網絡字節序說明