我使用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]中等等。
我在想我需要对每个数组进行位移,但事情变得复杂了。我接近这一切都错了吗?
答案 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
}