相同字節序的平臺在進行網絡通訊時能夠不進行字節序轉換,可是跨平臺進行網絡數據通訊時必須進行字節序轉換。網絡
緣由以下:網絡協議規定接收到得第一個字節是高字節,存放到低地址,因此發送時會首先去低地址取數據的高字節。小 端模式的多字節數據在存放時,低地址存放的是低字節,而被髮送方網絡協議函數發送時會首先去低地址取數據(想要取高字節,真正取得是低字節),接收方網絡 協議函數接收時會將接收到的第一個字節存放到低地址(想要接收高字節,真正接收的是低字節),因此最後雙方都正確的收發了數據。而相同平臺進行通訊時,如 果雙方都進行轉換最後雖然可以正確收發數據,可是所作的轉換是沒有意義的,形成資源的浪費。而不一樣平臺進行通訊時必須進行轉換,不轉換會形成錯誤的收發數據,字節序轉換函數會根據當前平臺的存儲模式作出相應正確的轉換,若是當前平臺是大端,則直接返回不進行轉換,若是當前平臺是小端,會將接收到得網絡字節序進行轉換。函數
"大端"和"小端"表示多字節值的哪一端存儲在該值的起始地址處;小端存儲在起始地址處,便是小端字節序;大端存儲在起始地址處,便是大端字節序; 或者說: 1.小端法(Little-Endian)就是低位字節排放在內存的低地址端(即該值的起始地址),高位字節排放在內存的高地址端; 2.大端法(Big-Endian)就是高位字節排放在內存的低地址端(即該值的起始地址),低位字節排放在內存的高地址端; 舉個簡單的例子,對於整型數據0x12345678,它在大端法和小端法的系統中,各自的存放方式以下圖1所示: spa
網絡上傳輸的數據都是字節流,對於一個多字節數值,在進行網絡傳輸的時候,先傳遞哪一個字節?也就是說,當接收端收到第一個字節的時候,它將這個字節做爲高位字節仍是低位字節處理,是一個比較有意義的問題; UDP/TCP/IP協議規定:把接收到的第一個字節看成高位字節看待,這就要求發送端發送的第一個字節是高位字節;而在發送端發送數據時,發送的第一個字節是該數值在內存中的起始地址處對應的那個字節,也就是說,該數值在內存中的起始地址處對應的那個字節就是要發送的第一個高位字節(即:高位字節存放在低地址處);因而可知,多字節數值在發送以前,在內存中因該是以大端法存放的; 因此說,網絡字節序是大端字節序; 好比,咱們通過網絡發送整型數值0x12345678時,在80X86平臺中,它是以小端發存放的,在發送以前須要使用系統提供的字節序轉換函數htonl()將其轉換成大端法存放的數值;以下圖2所示:內存