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

大端(Big-Endian)和小端(little-Endian)的起源

關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。
戰爭的緣由:你們都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,能夠那時的皇帝的祖父因爲小時侯吃雞蛋,按這種方法把手指弄破了,
所以他的父親,就下令,命令全部的子民吃雞蛋的時候,必須先打破雞蛋較小的一端,違令者重罰。而後老百姓對此法令極爲反感,期間發生了屢次叛亂,
其中一個皇帝所以送命,另外一個丟了王位,產生叛亂的緣由就是另外一個國家Blefuscu的國王大臣煽動起來的,叛亂平息後,就逃到這個帝國避難。據估計,
前後幾回有11000餘人情願死也不願去打破雞蛋較小的端吃雞蛋。這個其實諷刺當時英國和法國之間持續的衝突。Danny Cohen一位網絡協議的開創者,
第一次使用這兩個術語指代字節順序,後來就被你們普遍接受。網絡

大端小端之分

小端字節序和大端字節序表示存儲的字節順序有區別
小端字節序:低字節存於內存低地址;高字節存於內存高地址;
long型數據0x12345678
在小端系統中,函數

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

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

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

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

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

網絡字節序
網絡上傳輸的數據都是字節流,對於一個多字節數值,在進行網絡傳輸的時候,先傳遞哪一個字節?也就是說,當接收端收到第一個字節的時候,它將這個字節做爲高位字節仍是低位字節處理,是一個比較有意義的問題;
UDP/TCP/IP協議規定:把接收到的第一個字節看成高位字節看待,這就要求發送端發送的第一個字節是高位字節;而在發送端發送數據時,發送的第一個字節是該數值在內存中的起始地址處對應的那個字節,也就是說,該數值在內存中的起始地址處對應的那個字節就是要發送的第一個高位字節(即:高位字節存放在低地址處);因而可知,多字節數值在發送以前,在內存中因該是以大端法存放的;
因此說,網絡字節序是大端字節序;好比,咱們通過網絡發送整型數值0x12345678時,在80X86平臺中,它是以小端發存放的,在發送以前須要使用系統提供的字節序轉換函數htonl()將其轉換成大端法存放的數值;it

常見CPU的字節序
Big Endian : PowerPC、IBM、Sun
Little Endian : x8六、DEC
ARM既能夠工做在大端模式,也能夠工做在小端模式。table

相關文章
相關標籤/搜索