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