大端 小端和網路位元組序說明
大端(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既可以工作在大端模式,也可以工作在小端模式。