【发布时间】:2015-02-04 19:40:27
【问题描述】:
这是我第一次使用 StackOverflow,如果我含糊其辞,请见谅:P
我有这段代码,它在字节数组中搜索模式并返回它的位置。
public int FindPattern(byte[] Body, byte[] Pattern, int start = 0)
{
int foundIndex = -1;
bool match = false;
if (Body.Length > 0 && Pattern.Length > 0 && start <= Body.Length - Pattern.Length && Pattern.Length <= Body.Length)
for (int index = start; index <= Body.Length - Pattern.Length; index += 4)
if (Body[index] == Pattern[0])
{
match = true;
for (int index2 = 1; index2 <= Pattern.Length - 1; index2++)
{
if (Body[index + index2] != Pattern[index2])
{
match = false;
break;
}
}
if (match)
{
foundIndex = index;
break;
}
}
return foundIndex;
}
问题是我不知道如何包含字节掩码/通配符。
例如,如果我想查找以下字节模式:
0x5A, 0xC7, 0xAE, 0xB7, 0x2F
我将如何实现通配符搜索,所以如果我不知道字节数组中的某些字节或者它们发生了变化,例如,我将如何找到如下模式:
0x5A, 0x??, 0xAE, 0xB7, 0x??
?? = 表示我不知道会不时更改的字节。
有人有解决办法吗? - 我环顾四周,但找不到太多信息
提前致谢!, 詹姆斯
【问题讨论】:
-
您当前的方法签名无法获得通配符匹配。您需要首先添加另一个参数来帮助您标记哪些模式是通配符,或者将您的字节模式更改为可以携带更多信息的数据类型(如自定义对象或字符串)。
-
谢谢 :) 如果我转换为字符串,我将如何返回位置?
-
好吧,如果您将
pattern转换为示例中的字符串(使用0x??),您可以将字符串的一部分重新转换为 byte[] 并在逻辑中使用其他部分跳过一些索引(跳过 8 位,因为整个字节是通配符)?这仍然有点奇怪,因为无论您在哪里调用此方法,都必须对字符串进行编码。 -
转换为十六进制字符串...应用正则表达式并再次返回?
标签: c# arrays byte wildcard mask