問題:
給定兩個位元組數組,一個表示模式,另一個包含要搜尋的數據,確定模式在資料數組中匹配的位置。
解:
提供的程式碼使用Locate擴充方法提供了一個高效且簡潔的解決方案:
<code class="language-csharp">public static int[] Locate(this byte[] self, byte[] candidate) { if (IsEmptyLocate(self, candidate)) return Empty; var list = new List<int>(); for (int i = 0; i < self.Length; i++) { if (i + candidate.Length > self.Length) break; bool match = true; for (int j = 0; j < candidate.Length; j++) { if (self[i + j] != candidate[j]) { match = false; break; } } if (match) list.Add(i); } return list.ToArray(); } private static bool IsEmptyLocate(byte[] self, byte[] candidate) { return self == null || self.Length == 0 || candidate == null || candidate.Length == 0 || candidate.Length > self.Length; } private static readonly int[] Empty = new int[0];</code>
Locate方法迭代遍歷資料數組,檢查每個可能起始位置與模式的匹配。如果匹配,則將位置記錄到清單中;否則,繼續到下一個位置。
範例:
<code class="language-csharp">// 示例字节数组 byte[] pattern = new byte[] { 12, 3, 5, 76, 8, 0, 6, 125 }; byte[] toBeSearched = new byte[] { 23, 36, 43, 76, 125, 56, 34, 234, 12, 3, 5, 76, 8, 0, 6, 125, 234, 56, 211, 122, 22, 4, 7, 89, 76, 64, 12, 3, 5, 76, 8, 0, 6, 125 }; // 定位并打印匹配位置 foreach (var position in toBeSearched.Locate(pattern)) Console.WriteLine(position);</code>
程式碼對原始程式碼進行了輕微的改動,使其更易於理解,並添加了對空數組和模式長度大於資料長度情況的處理。 IsEmptyLocate
函數提高了程式碼的可讀性和可維護性。
以上是如何在 C# 中有效地找到另一個位元組數組模式中出現的所有情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!