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

2021-07-12 06:00:45 字數 1251 閱讀 2612

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

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...