Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Find subarray in the source array

using System; namespace Keyki.XNA.Video {     /// <summary>     /// Some internal utilities for handling arrays.     /// </summary>     ///      internal static class ByteArrayUtils     {         /// <summary>         /// Check if the array contains needle at specified position.         /// </summary>         ///          /// <param name="array">Source array to check for needle.</param>         /// <param name="needle">Needle we are searching for.</param>         /// <param name="startIndex">Start index in source array.</param>         ///          /// <returns>Returns <b>true</b> if the source array contains the needle at         /// the specified index. Otherwise it returns <b>false</b>.</returns>         ///          public static bool Compare(byte[] array, byte[] needle, int startIndex)         {             int needleLen = needle.Length;             // compare             for (int i = 0, p = startIndex; i < needleLen; i++, p++)             {                 if (array[p] != needle[i])                 {                     return false;                 }             }             return true;         }         /// <summary>         /// Find subarray in the source array.         /// </summary>         ///          /// <param name="array">Source array to search for needle.</param>         /// <param name="needle">Needle we are searching for.</param>         /// <param name="startIndex">Start index in source array.</param>         /// <param name="sourceLength">Number of bytes in source array, where the needle is searched for.</param>         ///          /// <returns>Returns starting position of the needle if it was found or <b>-1</b> otherwise.</returns>         ///          public static int Find(byte[] array, byte[] needle, int startIndex, int sourceLength)         {             int needleLen = needle.Length;             int index;             while (sourceLength >= needleLen)             {                 // find needle's starting element                 index = Array.IndexOf(array, needle[0], startIndex, sourceLength - needleLen + 1);                 // if we did not find even the first element of the needls, then the search is failed                 if (index == -1)                     return -1;                 int i, p;                 // check for needle                 for (i = 0, p = index; i < needleLen; i++, p++)                 {                     if (array[p] != needle[i])                     {                         break;                     }                 }                 if (i == needleLen)                 {                     // needle was found                     return index;                 }                 // continue to search for needle                 sourceLength -= (index - startIndex + 1);                 startIndex = index + 1;             }             return -1;         }     } }