大端、小端、網絡字節序

大端、小端、網絡字節序 


一、大端、小端
"大端"和"小端"表示多字節值的哪一端存儲在該值的起始地址處;小端存儲在起始地址處,即是小端字節序;大端存儲在起始地址處,即是大端字節序;
或者說:
1.小端法(Little-Endian)就是低位字節排放在內存的低地址端(即該值的起始地址),高位字節排放在內存的高地址端;
2.大端法(Big-Endian)就是高位字節排放在內存的低地址端(即該值的起始地址),低位字節排放在內存的高地址端;
舉個簡單的例子,對於整型數據0x12345678,它在大端法和小端法的系統中,各自的存放方式如下圖1所示:


大端、小端、網絡字節序 - 哥哥 - 哥哥


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


大端、小端、網絡字節序 - 哥哥 - 哥哥



轉自:http://bdxnote.blog.163.com/blog/static/8444235201091054458112/





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章