從長整型資料取位元組

2021-06-18 17:43:54 字數 1233 閱讀 7116

1 移位(佔記憶體,移植性一般)

2 強制轉換(方便,移植性差)

3 巨集定義(易讀,移植性好)

#define tobyte(x, i) (((char*)(&x))[i]) 

x表示資料,i表示位元組號

4 聯合體

union

byte;

} value;

訪問時直接,方便,如value.dw,value.byte.b0等

5 聯合體+巨集定義

#define value     value.dw   

#define value_0 value.byte.b0

#define value_1 value.byte.b1

#define value_2 value.byte.b2

#define value_3 value.byte.b3

直觀,使用方便

剛剛在討論位元組序的問題的時候出現了這麼乙個問題,怎麼訪問乙個整型變數裡面的各個位元組,我們知道,如果要訪問這個整型最低位址乙個位元組的資料的話,可以通過如下方式:

char a  =  *(char*)&整型變數名;

這裡先將整型數通過取位址符號獲得變數的開始的位址,為什麼要(char*)進行強制型別轉換呢,因為對於整型資料的話,表示的就是以首位址開始的4個位元組,它是乙個整體,取它的位址後,位址對應的型別為int*型別,即如果通過這個指標訪問的話,只能訪問到整個4個位元組的空間的資料,沒法訪問單個位元組。通過(char*)就將int*整型指標型別轉換為字元型指標型別。這樣就可以訪問低位址這個位元組的資料啦。那麼如果我想訪問第2個,第3個,第4個位元組的資料呢。我們先來看看以下表示:

char * pc = (char*)&整型變數名;

pc現在指向首位元組,要訪問下個位元組只需要*(p+1)就可以(即p[1]),同理下乙個*(p+2)、*(p+3)(p[2]、p[3])。那如果我們不進行指標轉換呢。我們看如下表示:

int *  pi  = &整型變數名;

這個時候用*pi將獲得四個位元組的內容。pi+1將指向下乙個整型位址空間,即0x0005位址,所以*(pi+1)(即pi[1])將訪問0x0005位址開始的四個位元組的內容。這裡有點需要強調的是,*(pi+i)總是等於pi[i]。整個過程如下圖所示:

圖一:指標加1的差別

通過上面的分析,想獲得乙個整型數裡面的某個位元組的值的話,我們可以如下表示:

char a  =  ((char*)&整型變數名)[i];

i=0表示首位元組,1表示第2個位元組,依次類推。

ByteBuf 讀取位元組陣列資料

bytebuf bytebuf pooledbytebufallocator.default.directbuffer 宣告乙個bytebuf 物件 bytebuf.writebyte 1 第一位置存放數字1 占用1個位元組 bytebuf.writeshort 0 第二位置存放數字 0 占用2個位...

從位元組陣列中讀取整型(最大四位)

region 從位元組陣列中讀取整型 最大四位 從位元組陣列中讀取整型 最大四位 超過四位時需要調整nstartindex 要讀取的資料來源 開始讀取的位置 讀取的大小 以int32型返回讀取到的數值 endregion private static int64 readintfrombytearr...

網路通訊時整型資料與位元組之間的轉換

在進行socket通訊時,常常需要傳輸某個變數值的長度,比如乙個註冊包有名字,位址等資訊。在進行包的封裝定義時,一般是以namelength name addresslength address形式封裝。而無線網路傳輸是按位元組流傳輸的,這就要求對整形資料進行轉換。乙個位元組表示的整數最大範圍是2的...