計算機系統中,我們是以字節為單位的,每個地址單元都對應着一個字節,一個字節為 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