2011-09-25 99 views
5

可能重复:
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()方法来知道该字节数组是否包含这些元素的顺序?

我知道我可以做semething,如:

String s = ""; 
foreach(byte b in myArray) 
{ 
    s = s + b.ToString(); 
} 

//then do 

s.Contains("9343") 

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

+0

如果您正在考虑做一个字符串做的内容包括:字符串myString的= System.Text.Encoding.ASCII.GetString(myByteArray) ,而是要等待一个合适的回答;-) – gordatron

+0

我不需要转换它到一个字符串。我只是使用了一个字符串,因为这是我知道的唯一方法,可以让我进行这种类型的比较。这很有用,虽然非常感谢 –

+0

真的有一个类似的问题对不起,我没有找到它。 –

回答

8

尝试的作品,并通过字节数组撕裂,直到你找到的字节模式的第一个字节的匹配,你要寻找的,然后通过走沿以下

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

在我的快速测试中,这有一个错误。如果要查找的数据是数组中的最后一个元素,它会提前退出循环。 我会做更多的测试来验证这一点并发布答案,但现在它基本上将第一个循环条件念为'<=' – CubanX

1

最简单的算法直到你到达最后,或者如果你发现不匹配,继续从你离开的地方继续。如果你保持部分匹配,这可以“降级”。根据你的需要,这可能够好了(写起来很简单,维护简单)。

如果您的目的不够快,您可以轻松采用Boyer-Moore