首页 >后端开发 >C++ >如何在 C# 中有效地查找另一个字节数组模式中出现的所有情况?

如何在 C# 中有效地查找另一个字节数组模式中出现的所有情况?

Patricia Arquette
Patricia Arquette原创
2025-01-20 18:01:13224浏览

高效查找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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn