2011-01-21 43 views
5
unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char)); 
unsigned char *single_char = adata+100; 

如何更改single_char中的前四位以表示1..10(int)之間的值?如何更改unsigned char中的4位?

問題來自TCP頭結構:

Data Offset: 4 bits 

The number of 32 bit words in the TCP Header. This indicates where 
the data begins. The TCP header (even one including options) is an 
integral number of 32 bits long. 

一般它具有4..5值,炭值是像0XA0。

回答

7

這些假設已經將* single_char初始化爲某個值。否則,解決方案caf張貼您所需要的。

(*single_char) = ((*single_char) & 0xF0) | val;

  1. (*single_char) & 11110000 - 將低4位爲0
  2. | val - 設置最後4位值(假設val爲< 16)

如果你想訪問您可以使用的最後4位 unsigned char v = (*single_char) & 0x0F;

如果y你想訪問更高的4位,你可以將掩碼上移4即。

unsigned char v = (*single_char) & 0xF0;

並對其進行設置:

(*single_char) = ((*single_char) & 0x0F) | (val << 4);

+1

在TCP報頭的特定情況下,這八位字節的低4位被保留,必須爲零。 – caf 2011-01-21 06:41:26

+1

啊好吧,那麼你的解決方案更好:) – GWW 2011-01-21 07:06:47

6

這將的*single_char高4位設置爲數據偏移量,以及清除的低4位:

unsigned data_offset = 5; /* Or whatever */ 

if (data_offset < 0x10) 
    *single_char = data_offset << 4; 
else 
    /* ERROR! */ 
2

我知道這是一箇舊帖子,但我不想讓其他人閱讀位運算符的長篇文章以獲得func重刑類似這些 -

//sets b as the first 4 bits of a(this is the one you asked for 
void set_h_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&15) | (b<<4); 
} 

//sets b as the last 4 bits of a(extra) 
void set_l_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&240) | b; 
} 

希望它可以幫助別人,將來

相關問題