首頁 > 後端開發 > C++ > 如何在 C# 中有效地找到另一個位元組數組模式中出現的所有情況?

如何在 C# 中有效地找到另一個位元組數組模式中出現的所有情況?

Patricia Arquette
發布: 2025-01-20 18:01:13
原創
212 人瀏覽過

高效查找C#中另一個位元組數組中的位元組數組模式的所有出現位置

問題:

給定兩個位元組數組,一個表示模式,另一個包含要搜尋的數據,確定模式在資料數組中匹配的位置。

解:

提供的程式碼使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板