linux下的位元組序轉換

2021-04-14 00:23:43 字數 1351 閱讀 2802

如果你要嘗試編寫linux環境下的網路程式,那麼一定會碰到這個位元組序問題,

與其每次碰到的時候都去查詢資料,不如一勞永逸,所以就做了乙個簡圖,可以

作為隨手檢視的資料,這裡所說的均在自己的機器上驗證過,但也都是個人的理解,

難免有誤。

位元組序,就是計算機在安排資料型別儲存的時候,怎樣儲存資料的高低位。其實這

一般和作業系統沒有關係,而是和計算機的硬體架構有關,具體的說,就是cpu的設計

有關,英特爾的晶元和amd的晶元組都是使用的小端位元組序(最低位元組優先儲存),

但是有些特別的cpu就不是這樣處理的。它們可能使用大端位元組序(最高位元組優先儲存),

這些在不同計算機上使用的位元組序稱為主機位元組序。

另外應明確,計算機cpu可以支援的最基本資料儲存是乙個位元組,資料位的操作使用

了特殊的暫存器。所以涉及到位元組序問題的資料型別,一定是整位元組的倍數,不可能是4bits。

也不可是乙個位元組,六進製表示起來就是:乙個資料0xab,不可能使用位元組序轉換為0xba。

為了在不同架構的計算機之間通訊,那麼網路上的位元組序就必須統一,網路位元組序使

用的是大端位元組序(最高位元組優先儲存),所以我們通常要在程式中做位元組序轉換,但是

為了方便程式的移植,基本上涉及到這類操作的地方都要進行位元組序轉換。     位元組序的轉

換,是當程式在系統上動態執行時進行的,它會根據當前cpu的執行模式來決定轉換還是

不轉換,所以使用位元組序轉換函式時非常必要的,這讓我們的程式移植很容易。

圖中給出了各種資料中常見的名詞,它們其實都是指乙個東東啊!       

對於,資料在網路中資料是怎麼儲存的,筆者這樣理解,在閘道器,或者其他網路裝置中,

在進行資料過濾等處理時可能存在不同的位元組序,但是到達我們網絡卡的資料一定是按照網

絡位元組序來儲存資料的,當nic收到乙個資料報的時候,它申請一塊記憶體區,然後存入數

據,這時候資料都是按照網路位元組序來儲存的,當我們的軟體程序要讀取這裡的資料的時

候,cpu將

找到位址,並根據指令來讀取一定的位元組數,這個時候,如果我們沒有進行字

節序轉換,並且

主機位元組序與網路位元組序不同,那麼問題就出現了,對於cpu來說,假設

它一貫(也只能,設計的

時候就確定了)從高位址讀取並作為資料的高位,那麼一切資料

都是錯誤的了,所以,轉換函

數又開闢了一塊記憶體,並將資料的序列完全翻轉過來,這樣

cpu來讀這塊資料就是正確的了。

位元組序的轉換

提供一種位元組序轉換實現的思路。假使在一台64位的機器上定義的整數int val 0x01020304,轉換之後為0x04030201 big endian little endian跟多位元組型別的資料有關的比如int,short,long型,而對單位元組資料byte卻沒有影響。big endia...

網路位元組序與主機位元組序的轉換

在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...

網路位元組序與主機位元組序的轉換

在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...