還是比較簡單的功能,在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值的重置,然後再判斷該位置是否匹配。