问题:
给定两个字节数组,一个表示模式,另一个包含要搜索的数据,确定模式在数据数组中匹配的位置。
解决方案:
提供的代码使用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中文网其他相关文章!