在C中匹配二进制模式
我正在开发一个需要解析一些定制数据结构的C程序,幸运的是我知道它们是如何构造的,但是我不知道如何在C中实现我的解析器。
每个结构的长度为32位,每个结构都可以通过它的二进制签名来识别。
例如,我感兴趣的有两种特殊结构,它们具有以下二进制模式(x表示0或1)
0000-00xx-xxxx-xxx0 0000-10xx-10xx-xxx0
在这些结构中,’x’位包含我需要的实际数据,因此基本上我需要一种基于每个结构中如何写入位来识别每个结构的方法。
所以作为伪代码中的一个例子:
if (binaryPattern = 000010xxxxxxxxx0) { do something with it; }
我猜测将它们作为整数读取,然后执行某种bitmasking将是要走的路,但我对C的了解不是很好,也许一个简单的逻辑OR运算就可以做到,但我只想要一些在我开始之前做这个的建议。
谢谢
非常感谢所有回答的人,非常有帮助!
要检查数据是否与特定二进制模式匹配,可以先屏蔽掉非签名位,然后将其与签名模板进行比较。
例如,要检查您的数据是否与0000 10xx 10xx xxx0签名匹配:
- 和你的输入数据1111 1100 1100 0001(面具)
- 检查输出是否等于0000 1000 1000 0000(模板)
用一些示例数据来说明:
DATA_1 0010 1011 1101 1100 DATA_2 0000 1011 1010 1100 MASK 1111 1100 1100 0001 & MASK 1111 1100 1100 0001 & -------------------- -------------------- 0010 1000 1100 0000 (NO_MATCH) 0000 1000 1000 0000 (MATCH) -------------------- --------------------
因此,每个规则都可以由掩码模板对表示,您需要的只是一个函数/操作,它将上述操作应用于您的数据以检查它是否匹配。
顺便说一句,你只显示16位模式,而不是32位…
无论如何,您可以定义代表您感兴趣的模式部分的蒙版。 使用您的值和掩码执行按位AND,如果结果是测试模式,则您已找到所需内容。
#define PATTERN1 0x0000 #define MASK1 0xfc01 #define PATTERN2 0x0880 #define MASK2 0xfcc1 if ((value & MASK1) == PATTERN1) { // have pattern 1 } else if ((value & MASK2) == PATTERN2) { // have pattern 2 }
如果你有更多的模式,显然最好将模式和掩码放在一个表中并循环它。
你需要的是二进制AND(&)
if( (value & matchPattern) == matchPattern ) { // do something with it. }
正如你所说的32位,所以我假设你使用像uint32_t这样的东西。 如果是这种情况,你可以这样:
uint32_t value = 0xF0F0ABCD; // 0xFOF0XXXD X = data uint32_t const matchPattern = 0xF0F0000D; if( (value & matchPattern) == matchPattern) { uint32_t use = value & 0x0000FFF0; // extracts the XXX part }
等等
我认为你可以对它们进行位掩码,将1放在有指定位的位置,当位无关紧要时为0。
例:
000000xxxxxxxxx0 000010xx10xxxxx0 1111110000000001 1111110011000001
然后将此secondo模式用作&按位运算,并将其与您需要的值进行比较(只需将x设置为零)。
第二种模式的示例应该是:
if( (value&0b1111110011000001)== 0b0000100010000000){ //pattern found }