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;
}
}
}
Related examples in the same category