Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Cari Semua Kejadian Corak Tatasusunan Byte dengan Cekap dalam Satu Lagi dalam C#?

Bagaimanakah Saya Boleh Cari Semua Kejadian Corak Tatasusunan Byte dengan Cekap dalam Satu Lagi dalam C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-20 18:01:13279semak imbas

Cekap mencari semua kemunculan corak tatasusunan bait dalam tatasusunan bait lain dalam C#

Soalan:

Memandangkan dua tatasusunan bait, satu mewakili corak dan satu lagi mengandungi data yang akan dicari, tentukan tempat dalam tatasusunan data corak itu sepadan.

Penyelesaian:

Kod yang disediakan menyediakan penyelesaian yang cekap dan ringkas menggunakan kaedah sambungan Cari:

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

Kaedah Locate berulang melalui tatasusunan data dan menyemak cara setiap kemungkinan kedudukan permulaan sepadan dengan corak. Jika ada perlawanan, rekod kedudukan ke dalam senarai jika tidak, teruskan ke kedudukan seterusnya.

Contoh:

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

Kod ini mengubah sedikit kod asal untuk memudahkan pemahaman dan menambahkan pengendalian tatasusunan kosong dan kes yang panjang coraknya lebih besar daripada panjang data. IsEmptyLocate Fungsi meningkatkan kebolehbacaan dan kebolehselenggaraan kod.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Cari Semua Kejadian Corak Tatasusunan Byte dengan Cekap dalam Satu Lagi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn