1. 程式人生 > >Bigendian、littleendian的結構體反序總結

Bigendian、littleendian的結構體反序總結

Bigendian順序和讀出來相同,littleendian和讀出來順序相反。

對於一個結構體,使用bigendian和littleendian,內部元素的順序變化,取決於具體的元素型別。

反序的原則:

  • 對於連著的幾個超過一個位元組(含一個位元組)的元素,例如下圖中的sourceport、destinationport、sequencenumber、requestnumber而言,無論大端小端,它們之間的先後順序是不會改變的。

  • 對於連著的幾個小於一個位元組的元素而言,例如下圖中的res1+doff、fin到cwr這兩組元素,這兩組內部的順序是前後顛倒的,即元素之間的順序會因大端小端而不同,但兩組之間的先後順序依然是不變的。

  • 對於一個大元素(位元組倍數大小)內部的反序,實際上是按位元組為單位的反序,而不是具體bit位的全反序(即,12345678 23456789是變成23456789 12345678,而不是變成98765432 87654321),可見下面這張圖片的例子。一個十六進位制數字,4個bit,兩個才是1位元組,所以實際上判斷的是位元組之間的十六進位制的01和02的先後,也不是具體bit的先後。

  • 產生每個bit都會倒序的錯覺,實際上是因為下圖中的fin到cwr8個元素每個都只有1bit,小元素位元組組間具體元素的倒序形式上等同於按bit倒序,但實際上原理應該是按元素倒序而不是按bit倒序。

總結:littleendian、bigendain涉及到結構體元素的先後順序時,應視元素大小而定:

  1. 8bit以上(含8bit)大元素,元素之間順序固定;元素內部,位元組之間順序顛倒;位元組內部的bit順序不變。
  2. 8bit以下小元素組成的元素位元組(8bit)組,位元組組內部,元素之間順序顛倒,具體元素內部順序不變。

即小元素的位元組組和大元素之間並列為第一級別;

每個大元素內部具體位元組間(如IP)和同一位元組元素組小元素之間為第二級別;

大元素具體位元組內部bit和小元素內部bit為第三級別。

反序的實質:

第一級別順序不變;

第二級別順序顛倒;

第三級別順序不變。

舉例:IP:192.168.128.64的倒序,屬於第二級別,是四個數字順序的倒序,即64.128.168.192,四個數字內部不再倒序,這和前文中8個1bit元素倒序本質上是相同的(第二級別的倒序是顛倒元素間的順序)。