4
unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char));
unsigned char *single_char = adata+100;

single_char の最初の 4 ビットを変更して、1 ~ 10 (int) の値を表すにはどうすればよいですか?

質問は 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 のようになります。

4

4 に答える 4

6

これらは、*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;

上位 4 ビットにアクセスしたい場合は、マスクを 4 つ上にシフトするだけです。

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

そしてそれらを設定するには:

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

于 2011-01-21T06:21:54.933 に答える
5

これにより、上位 4 ビットが*single_charデータ オフセットに設定され、下位 4 ビットがクリアされます。

unsigned data_offset = 5; /* Or whatever */

if (data_offset < 0x10)
    *single_char = data_offset << 4;
else
    /* ERROR! */
于 2011-01-21T06:23:01.983 に答える
2

ビット演算子を使用して個々のビットにアクセスし、要件に応じて変更できます。

于 2011-01-21T06:16:20.347 に答える