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
Libérer: 2025-01-20 18:01:13
original
277 Les gens l'ont consulté

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 :

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];
Copier après la connexion

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 :

// 示例字节数组
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);
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal