2011-01-21 95 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; 
} 

希望它可以帮助别人,将来

相关问题