.NET 非常支持在字符串中搜索字符串,但是当您需要搜索的数据不是字符串时该怎么办?
我有通过 NetworkStream 以常规块形式到达的二进制数据。数据包是二进制的,但它们都以字节的签名序列开头。我将这些块累积到一个更大的缓冲区中并寻找数据包开始签名。
我真正要找的是方法的byte[]
等价物String.IndexOf(ss)
。我有一种讨厌的感觉,我将不得不自己用一个循环和一个状态机来实现它。
有什么建议么?交给你了!
正如建议的那样, Array.IndexOf(byte) 至少会为我节省一个显式循环。自发布以来,我想到找到第一个签名字节,然后提前探测最后一个签名字节应该在哪里的匹配,然后如果它们都匹配,则尝试对字符串的其余部分进行蛮力比较。这种方法的优点是可以廉价地拒绝错误匹配,并允许我在有部分签名等待另一个块时廉价地拒绝。
谷歌透露,上述绝妙方案是“KMP”或Knuth-Morris-Pratt算法的退化案例。从好的方面来说,如果 Knuth 把他的名字写在上面,那可能是闪电般的润滑,从不好的方面来说,为什么每当我有一个好主意时,Donald Knuth 会在 25 年前想到它?
由于我不能将积分奖励给 Donald Knuth,我猜他们会去 Nelson。