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


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

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

大端小端之分

小端字節序和大端字節序表示存儲的字節順序有區別
小端字節序:低字節存於內存低地址;高字節存於內存高地址;
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既可以工作在大端模式,也可以工作在小端模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM