如何从256位消息中获取特定位?

时间:2016-08-11 05:24:10

标签: c++ c winsock

我使用winsock接收256位长的udp消息。我使用8个32位整数来保存数据。

int32_t dataReceived[8];   

recvfrom(client, (char *)&dataReceived, 8 * sizeof(int), 0, &fromAddr, &fromLen);

我需要获取特定的位,比如#100,#225,#55等。所以有些位将在dataReceived [3]中,有些位在dataReceived [4]中等等。

我在想我需要对每个数组进行位移,但事情变得复杂了。我接近这一切都错了吗?

4 个答案:

答案 0 :(得分:4)

为什么使用int32_t类型的缓冲区元素而不是uint32_t

我通常使用这样的东西:

int bit_needed = 100;
uint32_t the_bit = dataReceived[bit_needed>>5] & (1U << (bit_needed & 0x1F));

或者你可以使用这个(但它不适用于登录有符号整数):

int bit_needed = 100;
uint32_t the_bit = (dataReceived[bit_needed>>5] >> (bit_needed & 0x1F)) & 1U;

在其他答案中,您只能在每个int32_t中访问低位8位。

答案 1 :(得分:0)

从0开始计算位和字节时:

int bit_needed = 100;

所以:

int byte = int(bit_needed / 8);
int bit = bit_needed % 8;
int the_bit = dataReceived[byte] & (1 << bit);

如果recuired bit包含0,则the_bit将为零。如果它是1,那么the_bit将保持2到该字节内该位序数位的幂。

答案 2 :(得分:0)

你可以做一个小功能来完成这项工作。

uint8_t checkbit(uint32_t *dataReceived, int bitToCheck)
{
  byte = bitToCheck/32;
  bit = bitToCheck - byte*32;
  if( dataReceived[byte] & (1U<< bit))
    return 1;
  else 
    return 0;
}

请注意,如果使用位移,则应使用uint32_t而不是int32_t。有符号整数位移会导致不需要的结果,尤其是当MSbit为1时。

答案 3 :(得分:0)

您可以使用C或C ++中的宏来检查特定位:

#define bit_is_set(var,bit)     ((var) & (1 << (bit)))

然后是一个简单的if:

if(bit_is_set(message,29)){
//bit is set
}