在.NET中搜索字符串是非常好的,但是当你需要搜索的数据不是字符串时你会怎么做?
我有二进制数据通过NetworkStream到达常规块.数据包是二进制的,但它们都以签名字节序列开头.我将块累积到一个更大的缓冲区中并查找数据包开始签名.
我真正想要的是byte[]
等同于String.IndexOf(ss)
方法.我有一种讨厌的感觉,我将不得不用循环和状态机来实现这一点.
有什么建议?给你!
正如所建议的,Array.IndexOf(byte)至少会为我保存一个显式循环.自发布以来,我发现找到第一个签名字节,然后向前探测最后一个签名字节应该匹配的匹配,然后如果它们都匹配,则尝试对字符串的其余部分进行强力比较.这种方法的优点是可以廉价地拒绝错误匹配,并允许我在部分签名等待另一个块时便宜地拒绝.
谷歌透露,上述出色的计划是"KMP"或Knuth-Morris-Pratt算法的退化案例.如果Knuth把自己的名字放在它上面那么光明,那可能是闪电般的闪电,不足之处为什么每当我有一个好主意时唐纳德·克努特在25年前都会想到它?
由于我无法将分数奖励给Donald Knuth,我猜他们会去尼尔森.