在.NET中搜索字符串非常好,但是當你需要搜索的數據不是字符串時,你會做什麼?搜索字節[]
我有二進制數據通過NetworkStream定期塊到達。數據包是二進制的,但它們都以字節的簽名序列開始。我將這些塊積累到一個更大的緩衝區中並查找數據包的開始簽名。
我真正想要的是byte[]
相當於String.IndexOf(ss)
方法。我有一個討厭的感覺,我將不得不使用循環和狀態機自己實現這一點。
有什麼建議嗎?超過你!
如上所述,Array.IndexOf(byte)至少可以爲我節省一個顯式循環。自發布以來,我發現找到第一個簽名字節,然後探測最後一個簽名字節應該在哪裏的匹配,然後如果它們都匹配,則嘗試對字符串的其餘部分進行蠻力比較。這種方法的優點是便宜地拒絕錯誤匹配,並允許當我有部分簽名等待另一個塊時便宜地拒絕。
谷歌透露,上述輝煌的計劃是一個退化的「KMP」或Knuth-Morris-Pratt算法的情況。在光明的一面,如果Knuth把他的名字寫在上面,它可能是油脂閃電,爲什麼每當我有一個好主意Donald Knuth在25年前想到它時呢?
既然我不能給Donald Knuth評分,我猜他們會去尼爾森。
我不會寫協議,我正在和傳統硬件通話。我確實要寫下一個版本,而且我已經明確指出了你的建議。 – 2008-10-10 07:09:04