2011-09-25 97 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