从字节数组中获取字节块的起始位置

3
假设我有一个大小为4096的字节数组,有什么有效的方法可以获取匹配某个模式的5字节块的起始位置呢?
例如,我想获取第一个可能匹配字节数组的起始位置。
var match = new byte[] { 0x03, 0x04, 0x05, 0x06, 0x07 };

如果在我的字节数组中找到上述块,它将返回给我第一个字节(0x03)的位置。


如果您的搜索模式为{0x03,0x05},您期望看到什么样的结果? - Tigran
这可能会对您有所帮助:https://dev59.com/YXA75IYBdhLWcg3w7tx6 - Regenschein
2
另请参阅此答案,其中使用了Boyer-Moore模式匹配算法(这也是我可能会选择的算法):https://dev59.com/-WLVa4cB1Zd3GeqPsQEM#9890164 - Matthew Watson
对于 Boyer-Moore 模式,它非常高效,因为它跳过不匹配的字节,而不是通过所有字节进行暴力匹配。 - keyboardP
1个回答

3

您可以使用 Linq:

public static int IndexOfArray<T>(T[] source, T[] search)
{

    var result = Enumerable.Range(0, source.Length - search.Length)
                           .Select(i => new
                           {
                               Index = i,
                               Found = source.Skip(i)
                                  .Take(search.Length)
                                  .SequenceEqual(search)
                           })
                           .FirstOrDefault(e => e.Found);
    return result == null ? -1 : result.Index;
}        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接