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

本文关键字:字节 定顺序 排列 包含按 是否 字节数 数组 | 更新日期: 2023-09-27 18:09:32

可能重复:
byte[]阵列模式搜索

假设我有一个字节数组:

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

这在长数组上是无效的。什么是更有效的方法?

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

尝试以下

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;
}

最简单的算法是遍历字节数组,直到在要查找的字节模式中的第一个字节上找到匹配项,然后遍历这两个字节,直到到达末尾,或者如果发现不匹配,从停止的地方继续。如果一直得到部分匹配,这可能会"降级"。根据您的需要,这可能足够好(编写简单,维护简单(。

如果这还不够快,你可以很容易地采用博耶-摩尔。