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

single_charの最初の4ビットを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の値を持つ、char型の値が0xA0をのようなものです。

答えて

7

これらは、* single_charをある値に初期化したことを前提としています。それ以外の場合は、あなたが必要とするソリューションcafが掲載されます。

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

  1. (*single_char) & 11110000は - 0
  2. | valに低い4ビットをリセットします - (valが< 16であると仮定した場合)の値に、最後の4ビットをセットします

をしたい場合最後の4ビットにアクセスするには unsigned char v = (*single_char) & 0x0F;

もしyあなたは上位4ビットにアクセスしたいです。下位4ビット

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

+1

の誰かを助けるホープ、このオクテットの下位4ビットは予約され、ゼロでなければなりません。 – caf

+1

ああ、あなたのソリューションは良いです:) – GWW

+0

@GWW、最後に、それは私のために働いたあなたのソリューションでした。しかし時には奇妙な値を設定します(たとえば、single_charは0x80の代わりに16進数の0x86になります)。 –

3

bitwise operatorsを使用すると、個々のビットにアクセスし、要件に応じて変更することができます。

6

このオフセットデータに*single_charの高い4ビットを設定し、クリア:

unsigned data_offset = 5; /* Or whatever */ 

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

それは最初の4ビットを変更し、とにかく下位ビットに影響しませんか?ありがとう! –

+0

@mhambra: "first"は表記の問題です。最も重要な* 4ビットが変更されます。これは、TCPヘッダーのそのフィールドに必要なものです。私が書いたように、それは下の4ビットをクリア(ゼロ)します - これは同様にTCPヘッダーに必要なものです。これらの下位4ビットは予約されていてゼロでなければなりません。 – caf

2

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

、それらを設定します

私はこれが古い投稿だと知っていますが、他の人がビット演算子で長い記事を読んでファンクションを取得したくないこれらに類似ション -

//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; 
} 

それはTCPヘッダの特定の場合における将来

関連する問題