由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組(大端)序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。
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位域,只需要定義兩套資料結構,不再需要進行本機序->網路序->本機序的轉換過程
bit 位域大小端轉換問題
由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組 大端 序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。16bit和32bit的大小端轉換很常見,...
玩兒轉C語言 字元和字串
在c語言中,利用單引號和雙引號分別表示字元和字串,字串是指一串以nul位元組結尾的零個或多個字元。因為字串通常儲存在字元陣列中,所以c語言中不存在字串型別。但在使用時,如果不能真正理解兩者的本質區別,有可能會出現一些詭異的現象。下面我將通過實驗,進行詳細分析 1 字元特性試驗,如下 cpp view...
C中的位域與大小端問題
位元組內也是有大小端問題,與位元組中的大小端類似 1 little endian中的位應該這樣排列 01234567 即排在前面的是低位。因此,先分配least significant bits 2 而在big endian中,位應該這樣排列 76543210 即排在前面的是高位。因此,先分配mos...