2008-10-10 14 views
5

स्ट्रिंग के भीतर एक स्ट्रिंग की खोज करना .NET में बेहद अच्छी तरह से समर्थित है लेकिन जब आप खोज करने के लिए आवश्यक डेटा स्ट्रिंग नहीं करते हैं तो आप क्या करते हैं?बाइट खोजना []

मेरे पास नेटवर्कस्ट्रीम के माध्यम से नियमित भाग में बाइनरी डेटा आ रहा है। पैकेट बाइनरी हैं लेकिन वे सभी बाइट्स के हस्ताक्षर अनुक्रम से शुरू होते हैं। मैं भाग को एक बड़े बफर में जमा करता हूं और स्टार्ट-ऑफ-पैकेट हस्ताक्षर की तलाश करता हूं।

मैं वास्तव में क्या देख रहा हूं byte[]String.IndexOf(ss) विधि के बराबर है। मुझे एक बुरा लगा है मुझे इसे लूप और एक राज्य मशीन के साथ लागू करने जा रहा है।

कोई सुझाव? आप के लिए खत्म है!


के रूप में सुझाव दिया, Array.IndexOf (बाइट) कम से कम मुझे एक स्पष्ट पाश बचत होगी। पोस्टिंग के बाद, यह पहला हस्ताक्षर बाइट खोजने के लिए मेरे पास हुआ, फिर एक मैच के लिए आगे की जांच करें जहां अंतिम हस्ताक्षर बाइट होना चाहिए, फिर यदि वे दोनों स्ट्रिंग के बाकी हिस्सों के लिए एक ब्रूट-फोर्स तुलना करने का प्रयास करते हैं। इस दृष्टिकोण का झूठा मैचों को सस्ती रूप से अस्वीकार करने का लाभ है और मुझे एक और खंड के लंबित आंशिक हस्ताक्षर होने पर सस्ती रूप से अस्वीकार करने की इजाजत है।

Google बताता है कि उपर्युक्त शानदार योजना "केएमपी" या न्यूथ-मॉरिस-प्रैट एल्गोरिदम का एक अपमानजनक मामला है। उज्ज्वल तरफ अगर नूथ ने अपना नाम रखा तो शायद यह बिजली की कमी हो गई है, नकारात्मक बात यह है कि जब भी मुझे अच्छा विचार होता है तो डोनाल्ड Knuth 25 साल पहले इसके बारे में सोचा था?

चूंकि मैं डोनाल्ड Knuth को अंक नहीं दे सकता, मुझे लगता है कि वे नेल्सन जाते हैं।

उत्तर

3

आप एक बाइट खोजने के लिए Array.IndexOf का उपयोग कर सकते हैं।

हालांकि, मैं आपको चेतावनी दूंगा कि कुछ वैध डेटा गलती से आपके हस्ताक्षर हो सकते हैं और पूरी तरह से आपके आवेदन को फेंक सकते हैं। मेरी राय में एक बेहतर समाधान हमेशा एक चार बाइट पूर्णांक भेजना होगा जिसमें पैकेट का आकार होता है। फिर उस पैकेट के बफर को साफ़ करने के लिए कई बाइट पढ़ें।

आप टीसीपी यह पूरी तरह से एक ग्राहक शुरू के लिए कि वे या पैकेट आकार के बारे में झूठ स्मृति :)

+0

मुझे प्रोटोकॉल लिखना नहीं है, मैं विरासत हार्डवेयर से बात कर रहा हूं। मुझे अगले संस्करण को लिखना है और मैंने पहले से ही आपके सुझाव को निश्चित रूप से निर्दिष्ट कर दिया है। –

0

आप अप्रबंधित/असुरक्षित कोड का उपयोग कर सकते की एक बेवकूफ राशि का अनुरोध स्वीकार्य है उपयोग कर रहे हैं? यदि ऐसा है तो मैं शायद आपके बाइट सरणी को खोजने के लिए पॉइंटर अंकगणितीय का उपयोग करने का सुझाव दूंगा। इस तरह तार प्रभावी होते हैं। आप समान कर सकते हैं।

एक और समाधान आपके पैकेट डेटा को स्टोर करने के लिए एक शब्दकोश का उपयोग करने के लिए किया जा सकता है। कुंजी अपने हस्ताक्षर हो। इसके बजाय इसे खोजने के लिए तेज़ और आसान है। कई मायनों में, इस तरह base64string, एक simepl आवरण के रूप में (प्रयोग KeyedCollection यदि आप ऐसा करते) एक कुंजी के रूप में बाइट के लिए आदि

+0

वास्तव में अप्रबंधित कोड एक पिटा है क्योंकि हमारे पास मिश्रित 32/64 वातावरण है। यह आश्चर्यजनक है कि यह शुद्ध प्रबंधित कोड के लिए कितनी कम परेशानी है। कैच -22: मुझे पैकेट में स्ट्रीम को पार्स करने के लिए हस्ताक्षर की आवश्यकता है। –

2

बाइट सरणियों और तार के भीतर पैटर्न को खोजने के लिए सबसे तेजी से एल्गोरिदम कि मैं का इस्तेमाल किया है Boyer-Moore और सरल हैं बॉयर-मूर (उपयोगी जब पाठ खोजा जा रहा पाठ के लिए काफी अलग है)। मैंने जावा में एक फास्ट माइम पार्सर को लागू करने के लिए इसका इस्तेमाल किया। code आसानी से नेट पर पोर्ट किया जा सकता है (लाइसेंस एलजीपीएल है)।

संबंधित मुद्दे