| 存在“如果說(shuō)"跟word或者說(shuō)字長(cháng)根本就沒(méi)關(guān)系",假設有一數據文件里面有N多數順序排布,如果想以Little-Endian format 讀入內存某區域,那么應該怎么讀?怎么排?”這樣的問(wèn)題是由于對于endian的實(shí)質(zhì)理解的偏差,endian指的是當物理上的最小單元比邏輯上的最小單元小時(shí),邏輯到物理的單元排布關(guān)系。這里的“有一數據文件里面有N多數順序排布”,這個(gè)“有一數據”顯然不是邏輯上的最小單元,而其中的“N多數”的一個(gè)才是邏輯最小單元,于是可應用樓主表格中的原則排列,而“N多數”之間的順序則是由這“N多數”的宿主決定的,比如是你寫(xiě)的程序,這個(gè)順序由你決定。 剛才談到了,endian指的是當物理上的最小單元(內存單元)比邏輯上的最小單元(通常指字長(cháng),即一個(gè)word)小時(shí),邏輯到物理的單元排布關(guān)系。咱們接觸到的物理單元最小都是byte,在通信領(lǐng)域中,這里往往是bit,不過(guò)原理也是類(lèi)似的。 實(shí)踐可以給你更多的經(jīng)驗,比如在一個(gè)嵌入式系統的通信協(xié)議中,從底層射頻驅動(dòng)到上層的協(xié)議棧全部需要實(shí)現,那么很可能遇到多個(gè)endian的問(wèn)題,底層的bit序、協(xié)議層的byte序、應用層的byte序,這些都是不同的概念。 Big-Endian 和 Little-Endian 字節排序 字節排序 含義 Big-Endian 一個(gè)Word中的高位的Byte放在內存中這個(gè)Word區域的低地址處。 Little-Endian 一個(gè)Word中的低位的Byte放在內存中這個(gè)Word區域的低地址處。 必須注意的是:表中一個(gè)Word的長(cháng)度是16位,一個(gè)Byte的長(cháng)度是8位。如果一個(gè)數超過(guò)一個(gè)Word的長(cháng)度,必須先按Word分成若干部分,然后每一部分(即每個(gè)Word內部)按Big-Endian或者Little-Endian的不同操作來(lái)處理字節。 一個(gè)word的低位在右邊,左高右低。 一個(gè)例子: 如果我們將0x1234abcd寫(xiě)入到以0x0000開(kāi)始的內存中,則結果為 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x34 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12 除了moto的68K系列和dec的sparc是big endian外,常見(jiàn)的cpu都是little endian。ARM同時(shí)支持 big和little,實(shí)際應用中通常使用little endian。 |
聯(lián)系客服