字节模式查找(大海捞针)- Wildcard/Mask?
Byte Pattern Finding (Needle in Haystack) - Wildcard/Mask?
这是我第一次使用 Whosebug,如果我含糊不清,请见谅 :P
我有这段代码,它在字节数组中搜索一个模式,returns它的位置。
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;
}
问题是我不知道如何包含字节 Masking/Wildcards。
例如,如果我想找到以下字节模式:
0x5A, 0xC7, 0xAE, 0xB7, 0x2F
如果我不知道字节数组中的某些字节或它们发生变化,我将如何实现通配符搜索,例如,我将如何找到如下所示的模式:
0x5A, 0x??, 0xAE, 0xB7, 0x??
?? = 表示我不知道哪些字节会不时更改。
有人有解决办法吗? - 我环顾四周,但找不到太多信息
非常感谢!
詹姆斯
修改代码以支持通配符非常容易。使其在大量数据中高效搜索可能需要更复杂的算法,例如带有通配符的 Boyer-Moore(抱歉,我手边没有代码)。
这是实现前者的一种方法(超出我的想象):
public int FindPattern(byte[] Body, byte[] Pattern, bool[] Wild, 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 (Wild[0] || (Body[index] == Pattern[0]))
{
match = true;
for (int index2 = 1; index2 <= Pattern.Length - 1; index2++)
{
if (!Wild[index2] &&
(Body[index + index2] != Pattern[index2]))
{
match = false;
break;
}
}
if (match)
{
foundIndex = index;
break;
}
}
return foundIndex;
}
这里的期望是您传入全长的搜索模式,然后传入具有相同长度的通配符标志数组,因此您的示例
0x5A, 0x??, 0xAE, 0xB7, 0x??
将被传递为
0x5A, 0x00, 0xAE, 0xB7, 0x00, and then
false, true, false, false, true
这是我第一次使用 Whosebug,如果我含糊不清,请见谅 :P
我有这段代码,它在字节数组中搜索一个模式,returns它的位置。
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;
}
问题是我不知道如何包含字节 Masking/Wildcards。
例如,如果我想找到以下字节模式:
0x5A, 0xC7, 0xAE, 0xB7, 0x2F
如果我不知道字节数组中的某些字节或它们发生变化,我将如何实现通配符搜索,例如,我将如何找到如下所示的模式:
0x5A, 0x??, 0xAE, 0xB7, 0x??
?? = 表示我不知道哪些字节会不时更改。
有人有解决办法吗? - 我环顾四周,但找不到太多信息
非常感谢! 詹姆斯
修改代码以支持通配符非常容易。使其在大量数据中高效搜索可能需要更复杂的算法,例如带有通配符的 Boyer-Moore(抱歉,我手边没有代码)。
这是实现前者的一种方法(超出我的想象):
public int FindPattern(byte[] Body, byte[] Pattern, bool[] Wild, 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 (Wild[0] || (Body[index] == Pattern[0]))
{
match = true;
for (int index2 = 1; index2 <= Pattern.Length - 1; index2++)
{
if (!Wild[index2] &&
(Body[index + index2] != Pattern[index2]))
{
match = false;
break;
}
}
if (match)
{
foundIndex = index;
break;
}
}
return foundIndex;
}
这里的期望是您传入全长的搜索模式,然后传入具有相同长度的通配符标志数组,因此您的示例
0x5A, 0x??, 0xAE, 0xB7, 0x??
将被传递为
0x5A, 0x00, 0xAE, 0xB7, 0x00, and then
false, true, false, false, true