还是比较简单的功能,在data的byte数组搜索pattern出现的位置。当然这里可以对该功能进行扩展,例如实现忽略大小写,并防止异常情况等等。
public static List<int> indexOf(byte[] data, byte[] pattern)
{
List<int> matchedPos = new List<int>();
if (data.Length == 0 || data.Length < pattern.Length) return matchedPos;
int end = data.Length - pattern.Length;
bool matched = false;
for (int i = 0; i <= end; i++)
{
for (int j= 0; j < pattern.Length || !(matched = (j==pattern.Length)); j++)
{
if (data[i + j] != pattern[j]) break;
}
if (matched)
{
matched = false;
matchedPos.Add(i);
}
}
return matchedPos;
}
返回的结果是一个List<int>,如果其大小为0,则说明搜索失败。
这里留意内侧for(;;)的用法,通常判断到结尾时会认为正确并置相应的Boolean值,考虑到“||”的旁路,即只有在内侧for的“||”左边为False时才会执行右边的语句,于是我在右边语句中实现Boolean值的重置,然后再判断该位置是否匹配。