Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定字节数组是否包含特定顺序的字节_C#_Arrays_Comparison - Fatal编程技术网

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

C# 确定字节数组是否包含特定顺序的字节,c#,arrays,comparison,C#,Arrays,Comparison,可能重复: 假设我有一个字节数组: 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 +

可能重复:

假设我有一个字节数组:

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;
}
公共静态bool包含序列(字节[]到搜索,字节[]到查找){
for(变量i=0;i+toFind.Length
最简单的算法是对字节数组进行翻阅,直到在要查找的字节模式中的第一个字节上找到匹配项,然后在这两个字节之间进行翻阅,直到到达末尾,或者如果发现不匹配项,则从停止处继续。如果您不断获得部分匹配,这可能会“降级”。根据您的需要,这可能足够好了(编写和维护都很简单)


如果这对于您的目的来说不够快,您可以很容易地采用。

如果您正在考虑制作一个字符串来执行Contains:string myString=System.Text.Encoding.ASCII.GetString(myByteArray),请等待正确的答案;-)我不需要把它转换成字符串。我只是使用了一个字符串,因为这是我所知道的唯一一个能够进行这种比较的方法。这是很有用的,不过非常感谢。有一个类似的问题,很抱歉我没有找到它。在我的快速测试中,这有一个错误。如果要查找的数据是数组中的最后一个元素,则它会提前退出循环。我将做更多的测试来验证这一点并发布答案,但现在它基本上是重复第一个循环条件到
,这需要更改为“for(var I=0;I+toFind.Length