질문:
2개의 바이트 배열이 주어지면 하나는 패턴을 나타내고 다른 하나는 검색할 데이터를 포함하며 데이터 배열에서 패턴이 일치하는 위치를 결정합니다.
해결책:
제공된 코드는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!