假设我有一个字节数组:
byte[] myArray = new byte[]{1,2,3,4,5,6,7,1,9,3,4,3,4,7,6,5,6,7,8};
如何确定myArray是否按顺序包含字节9,3,4,3?我必须遍历数组,将每个元素附加到一个字符串然后使用String.Contains()方法来知道该字节数组是否包含该顺序的那些元素?
我知道我可以做类似的事情:
String s = "";
foreach(byte b in myArray)
{
s = s + b.ToString();
}
//then do
s.Contains("9343")
这不适用于长阵列。什么是更有效的方式呢?
答案 0 :(得分:9)
尝试以下
public static bool ContainsSequence(byte[] toSearch, byte[] toFind) {
for (var i = 0; i + toFind.Length < toSearch.Length; i++) {
var allSame = true;
for (var j = 0; j < toFind.Length; j++) {
if (toSearch[i + j] != toFind[j]) {
allSame = false;
break;
}
}
if (allSame) {
return true;
}
}
return false;
}
答案 1 :(得分:1)
最简单的算法,它可以翻转字节数组,直到找到你要查找的字节模式中第一个字节的匹配项,然后沿着这两个字符串走,直到你到达终点,或者如果你发现不匹配,从你离开的地方继续。如果你继续获得部分匹配,这可能会“降级”。根据您的需要,这可能足够好(编写简单,易于维护)。
如果速度不够快,您可以轻松采用Boyer-Moore。