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

single_char의 처음 네 비트를 1..10 (int) 사이의 값으로 나타내려면 어떻게해야합니까? 부호없는 문자에서 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이 - 0
  2. | val에 낮은 4 개 비트를 재설정 - 값으로 마지막 4 개 비트를 설정는

당신이 원하는 경우 (발은 < 16 가정) 사용할 수있는 마지막 4 비트에 액세스하려면 unsigned char v = (*single_char) & 0x0F;

만약 y o 상위 4 비트에 액세스하려면 4 위로 마스크를 옮길 수 있습니다. 하위 4 비트

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

+1

에 사람을 도움이되기를 바랍니다 제로이어야합니다. – 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 비트는 지워집니다 (0). TCP 헤더에 원하는 것과 마찬가지로이 하위 4 비트는 예약되어 있으므로 0이어야합니다. – caf

2

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

그들을 설정

나는 이것이 오래된 게시물이지만 다른 사람들이 비트 연산자에 대한 긴 기사를 읽고 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; 
} 

이 옥텟의 하위 4 비트가 예약되어 있습니다, 그것은 TCP 헤더의 특정 경우 미래 ​​

관련 문제