如何从256位的消息中获取特定的位
How to grab specific bits from a 256 bit message?
我使用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
}
相关文章:
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 如何从其他线程 winapi 获取消息
- C++ UDP 服务器在获取客户端地址配置时发送消息
- 获取从 C# 调用的 COM 方法的错误消息
- 从处理程序捕获时如何获取 Ada 异常消息C++?
- 如何获取列表命令的响应消息(从CFTPConnection)
- 尝试获取用户输入和cout消息期望,当我输入一个有效名称时,它将所有这些命名
- 在C++中获取" expected a ; "错误消息
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 使用 C/C++ 获取错误消息MSB6006错误代码 2
- 如何在消息文件中获取用户定义的字段
- 使用非静态消息处理程序获取GSTREAMER总线消息
- 无法获取程序来处理WM_PowerBroadcast消息
- ACE在同一PC上具有多个应用程序实例 - 仅首先获取消息
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- 从WM_char消息获取扫描代码
- C++ HexChat 发送消息获取聊天
- 获取谷歌测试异常抛出消息
- 0MQ-获取消息ip
- gdb、hp ux:获取消息找不到虚拟表 -- 对象可能尚未构造