bit 位域大小端轉換問題

2021-06-07 13:50:03 字數 1261 閱讀 8763

由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組(大端)序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。

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

圖1小端模式下在記憶體中存放的形式如下:

bit2(l4)

bit1 

bit3

bit2(h5)

圖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

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

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

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

2:傳輸的bit域資料需要進行本機序->網路序->本機序的轉換過程(bit域資料可以對映為對應長度的short或int型別進行轉換)

struct

short bitdata;

3:定義不超過乙個位元組的bit位域,只需要定義兩套資料結構,不再需要進行本機序->網路序->本機序的轉換過程

摘自

玩兒轉C語言 bit 位域大小端轉換及傳輸

由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組 大端 序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。16bit和32bit的大小端轉換很常見,...

大小端 位域

小端 低位 lsb 位於低位址 大端 高位 msb 位於低位址 x86一般使用小端模式 位域 typedef union liteu32 t test t 位域的分配 小端 從lsb msb,從低位址到高位址 大端 從msb lsb,從高位址到低位址 例如 test t tt tt.t 0x3f p...

大小端,位域

大小端是指資料在記憶體中存放的順序,大於乙個位元組的整數,在記憶體中低位元組在前的就是小端,高位元組在前的就是大端。用c語言程式來判斷大端機還是小端機 include int main 位域 位域是指資訊在儲存時,並不需要占用完整的位元組,只需要占用幾個二進位制位。位域就是把乙個位元組中的二進位制位...