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?
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;
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With