Heim >Backend-Entwicklung >C++ >Wie kann ich in C# effizient alle Vorkommen eines Byte-Array-Musters in einem anderen finden?

Wie kann ich in C# effizient alle Vorkommen eines Byte-Array-Musters in einem anderen finden?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-20 18:01:13257Durchsuche

Finden Sie effizient alle Vorkommen eines Byte-Array-Musters in einem anderen Byte-Array in C#

Frage:

Bestimmen Sie anhand von zwei Byte-Arrays, von denen eines das Muster darstellt und das andere die zu durchsuchenden Daten enthält, wo im Datenarray das Muster übereinstimmt.

Lösung:

Der bereitgestellte Code bietet eine effiziente und prägnante Lösung mit der Locate-Erweiterungsmethode:

<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>

Die Locate-Methode durchläuft das Datenarray und prüft, wie jede mögliche Startposition mit dem Muster übereinstimmt. Wenn es eine Übereinstimmung gibt, tragen Sie die Position in die Liste ein. Andernfalls fahren Sie mit der nächsten Position fort.

Beispiel:

<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#?

Dieser Code ändert den ursprünglichen Code geringfügig, um ihn verständlicher zu machen, und fügt die Behandlung leerer Arrays und Fälle hinzu, in denen die Musterlänge größer als die Datenlänge ist. IsEmptyLocate Funktionen verbessern die Lesbarkeit und Wartbarkeit des Codes.

Das obige ist der detaillierte Inhalt vonWie kann ich in C# effizient alle Vorkommen eines Byte-Array-Musters in einem anderen finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn