由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組(大端)序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。
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 位域 位域是指資訊在儲存時,並不需要占用完整的位元組,只需要占用幾個二進位制位。位域就是把乙個位元組中的二進位制位...