質問:
2 つのバイト配列が与えられ、1 つはパターンを表し、もう 1 つは検索対象のデータを含み、データ配列内のどこにパターンが一致するかを決定します。
解決策:
提供されたコードは、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 中国語 Web サイトの他の関連記事を参照してください。