2011-09-25 16 views
5

Powiel możliwe:
byte[] array pattern searchustalić, czy tablica bajtów zawiera bajtów w określonej kolejności

Powiedzmy mam tablicę bajtów:

byte[] myArray = new byte[]{1,2,3,4,5,6,7,1,9,3,4,3,4,7,6,5,6,7,8}; 

jaki sposób Ustalam, czy myArray zawiera bajty 9,3,4,3 w tej kolejności? czy muszę iterować przez tablicę dołączając każdy element do łańcucha, a następnie użyć metody String.Contains(), aby wiedzieć, czy tablica bajtów zawiera te elementy w tej kolejności?

wiem, że mogę zrobić semething jak:

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

//then do 

s.Contains("9343") 

ten nie jest skuteczny na długich tablic. Jaki będzie bardziej wydajny sposób na zrobienie tego?

+0

jeśli myślisz o dokonanie ciąg zrobić Zawiera: string myString = System.Text.Encoding.ASCII.GetString (myByteArray) ale czekać na właściwą odpowiedź ;-) – gordatron

+0

nie trzeba konwertować do łańcucha. Użyłem tylko łańcucha, ponieważ jest to jedyna znana mi metoda, która umożliwi mi dokonanie tego rodzaju porównania. to było przydatne, chociaż bardzo dziękuję –

+0

prawda jest podobne pytanie przepraszam, że nie znalazłem. –

Odpowiedz

8

Spróbuj następującą

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

W moich szybkich testach miało to jeden błąd. Jeśli dane do znalezienia były ostatnimi elementami w tablicy, opuściły pętlę wcześniej. Zrobię trochę więcej testów, aby to zweryfikować i opublikować odpowiedź, ale na razie to jest zasadniczo intonowanie warunku pierwszej pętli do '<=' – CubanX

1

Najprostszy algorytm, który działa i jest do zgrywania za pośrednictwem tablicy bajtów, aż znajdziesz spotkanie na pierwszy bajt w bajt wzorca że szukasz następnie wzdłuż przez dwie, aż dojdziesz do końca, lub jeśli znajdziesz niedopasowanie, kontynuuj od miejsca, w którym skończyłeś. To może się "pogorszyć", jeśli nadal otrzymujesz częściowe dopasowania. W zależności od Twoich potrzeb może to być wystarczająco dobre (można je łatwo napisać, jest proste w obsłudze).

Jeśli to nie jest wystarczająco szybkie dla twoich potrzeb, możesz łatwo przyjąć Boyer-Moore.

Powiązane problemy