端序包括位元組序和位序。
結論a:
struct定義字段按照從記憶體低位位址到高位位址排列。
簡單回顧大小尾:
大尾序符合人們習慣,數的高位分布在記憶體中的低位位址。
小尾序相反。
使用場景:當本地的多位元組整數如short或long,需要傳送到網路。
不同的裝置可能使用不同的位元組序(包括大尾序、小尾序等,具體取決於cpu型別),導致多位元組整形變數在記憶體中排列的順序不同, 直接傳送到網路,導致位元組序不同的裝置傳送同樣的內容產生不同的效果。所以網路傳送前,整形變數需要進行一次轉換,轉換為網路序(網路序為大尾序)。
比如,實際值0x12345678,在大尾序中,記憶體從低位位址到高排位址列順序為0x12345678,小尾序中從低到高為0x78563412。它們都是以位元組為基本單元的。
除了位元組序,還有位序。如果只是從事上層開發,應該不用關注到位序。
不過如果剛看過linux中tcp.h、ip.h的定義並需要使用的同學,可能還有疑問。
位序和位元組序一樣,大尾在記憶體中的排列符合人類習慣,在記憶體中高位數值分布在低位位址(或許不應該這麼叫),小尾正好相反。
結論b:
對於傳送同乙個位元組,大尾和小尾在記憶體中分布是不同的,但是能達到同樣的效果,底層在傳送時,傳送的內容取決於位元組的實際值,和位元組內的記憶體中順序無關。
下面給出linux的ip.h檔案中的一部分:
struct iphdr ;
先給出結論:
結論c:
開發者可以不用關心位序相關的內容,直接使用相關字段即可。
下面簡單驗證上面的結論。
已知struct中的字段排列為由低位到高位,令 version=1,ihl=2,
在大尾裝置上,根據上面結構體,記憶體中的內容為:0001 0002,實際值為0001 0002
在小尾裝置上,如果version欄位在前,由結論a,得到記憶體中的內容為:1000 2000,實際值為0002 1000
在小尾裝置上,根據上面結構體,記憶體中的內容為:2000 1000,實際值為0001 0002
可以看出,第三組與第一組的實際值吻合,由結論b,兩個位元組內容相同即可產生相同的報文,得知驗證成功。
大端序與小端序 位元組序與位域的儲存
談到位元組序的問題,必然牽涉到兩大cpu派系 motorola的powerpc系列cpu和intel的x86系列cpu。powerpc系列採用big endian 大端序 大字節序 高位元組序 方式儲存資料,而x86系列則採用little endian 小端序 小字節序 低位元組序 方式儲存資料。何...
大小端 位域
小端 低位 lsb 位於低位址 大端 高位 msb 位於低位址 x86一般使用小端模式 位域 typedef union liteu32 t test t 位域的分配 小端 從lsb msb,從低位址到高位址 大端 從msb lsb,從高位址到低位址 例如 test t tt tt.t 0x3f p...
大小端,位域
大小端是指資料在記憶體中存放的順序,大於乙個位元組的整數,在記憶體中低位元組在前的就是小端,高位元組在前的就是大端。用c語言程式來判斷大端機還是小端機 include int main 位域 位域是指資訊在儲存時,並不需要占用完整的位元組,只需要占用幾個二進位制位。位域就是把乙個位元組中的二進位制位...