确定字节数组是否包含特定顺序的字节

时间:2011-09-25 16:38:41

标签: c# arrays comparison

  

可能重复:
  byte[] array pattern search

假设我有一个字节数组:

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")

这不适用于长阵列。什么是更有效的方式呢?

2 个答案:

答案 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