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

How to grab specific bits from a 256 bit message?

本文关键字:获取 消息 256位      更新时间:2023-10-16

我使用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]中,等等。

我想我需要对每个数组进行位移,但是事情变得复杂了。我是不是说错了?

为什么使用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位

当您从0开始计数位和字节时:

int bit_needed = 100;

:

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

如果所需的位包含0,则the_bit将为0。如果为1,则the_bit将保留2的位序数的次幂

您可以编写一个小函数来完成这项工作。

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时。

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

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

,然后是一个简单的if:

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