如果你要嘗試編寫linux環境下的網路程式,那麼一定會碰到這個位元組序問題,
與其每次碰到的時候都去尋找資料,不如一勞永逸,所以就做了一個簡圖,可以
作為隨手查看的資料,這裡所說的均在自己的機器上驗證過,但也都是個人的理解,
難免有誤。
位元組序,就是電腦在安排資料類型儲存的時候,怎樣儲存資料的高低位。其實這
一般和作業系統沒有關係,而是和電腦的硬體架構有關,具體的說,就是CPU的設計
有關,英特爾的晶片和AMD的晶片集都是使用的小端位元組序(最低位元組優先儲存),
但是有些特別的CPU就不是這樣處理的。它們可能使用大端位元組序(最高位元組優先儲存),
這些在不同電腦上使用的位元組序稱為主機位元組序。
另外應明確,電腦CPU可以支援的最基本資料存放區是一個位元組,資料位元的操作使用
了特殊的寄存器。所以涉及到位元組序問題的資料類型,一定是整位元組的倍數,不可能是4bits。
也不可是一個位元組,六進位表示起來就是:一個資料0XAB,不可能使用位元組序轉換為0XBA。
為了在不同架構的電腦之間通訊,那麼網路上的位元組序就必須統一,網路位元組序使
用的是大端位元組序(最高位元組優先儲存),所以我們通常要在程式中做位元組序轉換,但是
為了方便程式的移植,基本上涉及到這類操作的地方都要進行位元組序轉換。 位元組序的轉
換,是當程式在系統上動態運行時進行的,它會根據當前CPU的運行模式來決定轉換還是
不轉換,所以使用位元組序轉換函式時非常必要的,這讓我們的程式移植很容易。
給出了很詳細的處理函數和相關的資料變化:
圖中給出了各種資料中常見的名詞,它們其實都是指一個東東啊! 對於,資料在網路中資料是怎麼儲存的,筆者這樣理解,在網關,或者其他網路裝置中,在進行資料過濾等處理時可能存在不同的位元組序,但是到達我們網卡的資料一定是按照網路位元組序來儲存資料的,當NIC收到一個資料包的時候,它申請一塊記憶體區,然後存入資料,這時候資料都是按照網路位元組序來儲存的,當我們的軟體進程要讀取這裡的資料的時候,CPU將找到地址,並根據指令來讀取一定的位元組數,這個時候,如果我們沒有進行位元組序轉換,並且主機位元組序與網路位元組序不同,那麼問題就出現了,對於CPU來說,假設它一貫(也只能,設計的時候就確定了)從高地址讀取並作為資料的高位,那麼一切資料都是錯誤的了,所以,轉換函式又開闢了一塊記憶體,並將資料的序列完全翻轉過來,這樣CPU來讀這塊資料就是正確的了。