網路通訊中的位元組序轉換及大端 小端

2021-07-04 03:37:16 字數 1092 閱讀 1529

相同位元組序的平台在進行網路通訊時可以不進行位元組序轉換,但是跨平台進行網路資料通訊時必須進行位元組序轉換。

原因如下:網路協議規定接收到得第乙個位元組是高位元組,存放到低位址,所以傳送時會首先去低位址取資料的高位元組。小端模式的多位元組資料在存放時,低位址存放的是低位元組,而被傳送方網路協議函式傳送時會首先去低位址取資料(想要取高位元組,真正取得是低位元組),接收方網路協議函式接收時會將接收到的第乙個位元組存放到低位址(想要接收高位元組,真正接收的是低位元組),所以最後雙方都正確的收發了資料。而相同平台進行通訊時,如果雙方都進行轉換最後雖然能夠正確收發資料,但是所做的轉換是沒有意義的,造成資源的浪費。而不同平台進行通訊時必須進行轉換,不轉換會造成錯誤的收發資料,位元組序轉換函式會根據當前平台的儲存模式做出相應正確的轉換,如果當前平台是大端,則直接返回不進行轉換,如果當前平台是小端,會將接收到得網路位元組序進行轉換。

二、大端和小端

"大端"和"小端"表示多位元組值的哪一端儲存在該值的起始位址處;小端儲存在起始位址處,即是小端位元組序;大端儲存在起始位址處,即是大端位元組序; 或者說: 1.小端法(little-endian)就是低位位元組排放在記憶體的低位址端(即該值的起始位址),高位位元組排放在記憶體的高位址端; 2.大端法(big-endian)就是高位位元組排放在記憶體的低位址端(即該值的起始位址),低位位元組排放在記憶體的高位址端.

網路上傳輸的資料都是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它將這個位元組作為高位位元組還是低位位元組處理,是乙個比較有意義的問題; udp/tcp/ip

協議規定

:把接收到的第乙個位元組當作高位位元組看待

,這就要求傳送端傳送的第乙個位元組是高位位元組

;而在傳送端傳送資料時,傳送的第乙個位元組是該數值在記憶體中的起始位址處對應的那個位元組,也就是說,該數值在記憶體中的起始位址處對應的那個位元組就是要傳送的第乙個高位位元組(即:高位位元組存放在低位址處);由此可見,多位元組數值在傳送之前

,在記憶體中因該是以大端法存放的

; 所以說,網路位元組序是大端位元組序; 比如,我們經過網路傳送整型數值0x12345678時,在80x86平台中,它是以小端發存放的,在傳送之前需要使用系統提供的位元組序轉換函式htonl()將其轉換成大端法存放的數值

大端位元組序 小端位元組序(網路位元組序 主機位元組序)

大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...

TCP IP 大端 小端位元組序,網路位元組序

不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是...

網路位元組序 大端 小端

1.小端法 little endian 就是低位位元組排放在記憶體的低位址端 即該值的起始位址 高位位元組排放在記憶體的高位址端 2.大端法 big endian 就是高位位元組排放在記憶體的低位址端 即該值的起始位址 低位位元組排放在記憶體的高位址端 網路上傳輸的資料都是位元組流,對於乙個多位元組...