ホームページ >バックエンド開発 >C++ >C# で別のバイト配列パターン内で出現するすべてのバイト配列パターンを効率的に見つけるにはどうすればよいですか?

C# で別のバイト配列パターン内で出現するすべてのバイト配列パターンを効率的に見つけるにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-20 18:01:13255ブラウズ

C# で別のバイト配列内のバイト配列パターンの出現をすべて効率的に検索します

質問:

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>

How Can I Efficiently Find All Occurrences of a Byte Array Pattern within Another in C#?

このコードは、理解しやすくするために元のコードをわずかに変更し、空の配列とパターン長がデータ長よりも大きい場合の処理​​を追加しています。 IsEmptyLocate 関数により、コードの可読性と保守性が向上します。

以上がC# で別のバイト配列パターン内で出現するすべてのバイト配列パターンを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。