bit 位域大小端轉換問題


    計算機系統中,我們是以字節為單位的,每個地址單元都對應着一個字節,一個字節為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,那么必然存在着一個如何將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那么0x11為高字節,0x22為低字節。對於 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。----百度百科

    由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通信就需要進行大小端轉換。任何在不同系統間的通信信息都經過網絡字節(大端)序進行傳輸,也就是說不管本機是什么模式,都要保證發送端傳輸的數據轉換為網絡序,接受端都要把網絡序的數據轉換為本地序。

    16bit和32bit的大小端轉換很常見,一般也不會存在什么問題。但如果定義的數據結構中包含bit位域,該如何轉換呢?

    1)低字節都存放在低地址

    2)大端模式首先為字段的高bit位分配空間,小端模式首先為字段的低bit位分配空間

    3)大端模式首先存放在地址的高bit位,小端模式首先存放在地址的低bit位

    一個例子

    struct

    {

         short bit1:4

         short bit2:9

         short bit3:3

    };

    大端模式下在內存中存放的形式如下:

 

             Bit1

 

          Bit2(h4) 

 

              Bit2(l5)

 

             Bit3

    7                                                 0 7                                                                                  0

                                                                                       圖1

    小端模式下在內存中存放的形式如下:

 

         Bit2(l4)

 

          Bit1 

 

            Bit3

 

              Bit2(h5)

     7                                                 0 7                                                       0

                                                                                       圖2

     如果我們在小端機器上,數據流按照圖2的格式發送到目標端是大端的機器上,明顯不能直接通過圖1的結構來解碼。

     如果為大小端分別定義兩套結構呢?定義如下:

    struct

    {

        #ifdef __LITTLE_ENDIAN__

         short bit1:4

         short bit2:9

         short bit3:3

        #else

         short bit3:3

         short bit2:9

         short bit1:4

         #endif

    };

    在大端的機器上我們按照下面的格式進行解析:

 

         Bit3

 

        Bit2(h5)

 

           Bit2(l4)

 

                   Bit1

    7                                                0 7                                                         0

                                                                                   圖3

    可是解碼的數據還是不對,但觀察一下不難發現,如果我們把小端的的數據(圖2)前后兩個字節顛倒,就和大端機器上的結構(圖3)完全一致了。

    綜上所述,bit位域的大小端轉換如下:

    1: 在機器上定義大小端兩套數據結構分別針對大小端

    2:傳輸的bit域數據需要進行本機序->網絡序->本機序的轉換過程(bit域數據可以映射為對應長度的short或int類型進行轉換)

    struct

    {

         short bitData;

    };

    3:定義不超過一個字節的bit位域,只需要定義兩套數據結構,不再需要進行本機序->網絡序->本機序的轉換過程

http://www.cnblogs.com/chencheng/archive/2012/06/19/2554081.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM