Maison >développement back-end >C++ >Comment puis-je trouver efficacement toutes les occurrences d'un modèle de tableau d'octets dans un autre en C# ?

Comment puis-je trouver efficacement toutes les occurrences d'un modèle de tableau d'octets dans un autre en C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-20 18:01:13280parcourir

Trouver efficacement toutes les occurrences d'un modèle de tableau d'octets dans un autre tableau d'octets en C#

Question :

Étant donné deux tableaux d'octets, l'un représentant le modèle et l'autre contenant les données à rechercher, déterminez où dans le tableau de données le modèle correspond.

Solution :

Le code fourni fournit une solution efficace et concise en utilisant la méthode d'extension 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>

La méthode Locate parcourt le tableau de données et vérifie comment chaque position de départ possible correspond au modèle. S'il y a une correspondance, enregistrez la position dans la liste, sinon passez à la position suivante ;

Exemple :

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

Ce code modifie légèrement le code d'origine pour le rendre plus facile à comprendre et ajoute la gestion des tableaux vides et des cas où la longueur du motif est supérieure à la longueur des données. IsEmptyLocate Les fonctions améliorent la lisibilité et la maintenabilité du code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn