Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

determine if array of bytes contains bytes in a specific order [duplicate]

Possible Duplicate:
byte[] array pattern search

Let's say I have an array of bytes:

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

how can I determine if myArray contains bytes 9,3,4,3 in that order? do I have to iterate through the array appending each element to a string then use the String.Contains() method to know if that byte array contains those elements in that order?

I know I can do semething like:

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

//then do  

s.Contains("9343")

this is not to efficient on long arrays. What will be a more efficient way of doing this?

like image 260
Tono Nam Avatar asked Sep 25 '11 16:09

Tono Nam


2 Answers

Try the following

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;
}
like image 138
JaredPar Avatar answered Oct 13 '22 19:10

JaredPar


The simplest algorithm that works and is to rip through the byte array until you find a match on the first byte in the byte pattern that you're looking for then walk along through the two until you reach the end, or if you find a mismatch, continue from where you left off. This can "degrade" if you keep getting partial matches. Depending on your needs, this could be good enough (it's simple to write, simple to maintain).

If that isn't fast enough for your purposes, you can easily adopt Boyer-Moore.

like image 1
jason Avatar answered Oct 13 '22 20:10

jason