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

Jak zmienić pierwsze cztery bity w pojedynczym_char, aby przedstawić wartości między 1..10 (int)?Jak zmienić 4 bity w unsigned char?

Pytanie pochodzi od struktury nagłówka 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. 

Zwykle ma ona wartość 4..5 wartość char jest jak 0xa0.

Odpowiedz

7

Te mają założenie, że zainicjalizowałeś * pojedynczy_char na pewną wartość. W przeciwnym razie rozwiązanie caf zrobi to, czego potrzebujesz.

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

  1. (*single_char) & 11110000 - Przywraca niskie 4 bity 0
  2. | val - Ustawia ostatnie 4 bity wartości (zakładając val jest < 16)

Jeśli chcesz aby uzyskać dostęp do ostatnich 4 bitów, które można użyć unsigned char v = (*single_char) & 0x0F;

Jeśli y chcesz uzyskać dostęp do wyższych 4 bitów, wystarczy przesunąć maskę w górę 4, tj.

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

i ustawić je:

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

+1

w konkretnym przypadku nagłówka TCP, niższe 4 bity tego oktetu są zarezerwowane i musi być zero. – caf

+1

Ah w porządku, twoje rozwiązanie jest lepsze :) – GWW

+0

@ GWW, na końcu to było twoje rozwiązanie, które działało dla mnie. Ale czasami ustawia dziwne wartości .. (na przykład, pojedynczy_char staje się hexem 0x86 zamiast 0x80). –

3

Możesz użyć bitwise operators, aby uzyskać dostęp do poszczególnych bitów i modyfikować zgodnie z własnymi wymaganiami.

6

Spowoduje to ustawienie wielkości 4 bity *single_char danych korekcji i oczyścić dolne 4 bity:

unsigned data_offset = 5; /* Or whatever */ 

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

Więc zmieni się pierwsze 4 bity i tak czy inaczej nie wpłynie na niższe bity? Dzięki! –

+0

@mhambra: "first" jest kwestią notacji - zmieni * najważniejsze * 4 bity, co jest tym, czego potrzebujesz dla tego pola nagłówka TCP. Jak już napisałem, wyczyści (zero) 4 dolne bity - i to jest to, czego oczekujesz od nagłówka TCP, gdzie te niższe 4 bity są zarezerwowane i muszą wynosić zero. – caf

2

Wiem, że jest to stary post, ale nie chcę, aby inni czytali długie artykuły na temat operatorów bitowych, aby uzyskać func nia podobny do nich -

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

Mam nadzieję, że ktoś pomoże w przyszłości