2011-12-17 14 views
10

मुझे बाइनरी डेटा की एक धारा को सीमित करने में सक्षम होना चाहिए। मैं ऐसा करने के लिए एएससीआईआई ईओटी (ट्रांसमिशन एंड एंड) चरित्र जैसे कुछ का उपयोग करने की सोच रहा था।द्विआधारी अनुक्रमों को सीमित करना

हालांकि मैं थोड़ा चिंतित हूं - मैं यह सुनिश्चित करने के लिए कैसे जान सकता हूं कि इस (0b00000100) के लिए उपयोग किया जाने वाला विशेष बाइनरी अनुक्रम मेरे अपने बाइनरी अनुक्रमों में दिखाई नहीं देगा, इस प्रकार सीमांकन पर झूठी सकारात्मक देगी?

दूसरे शब्दों में, बाइनरी सीमांकन को सर्वोत्तम तरीके से कैसे नियंत्रित किया जाता है?

संपादित करें: ... लंबाई शीर्षलेख का उपयोग किए बिना। क्षमा करें दोस्तों, इससे पहले उल्लेख किया जाना चाहिए था।

उत्तर

7

आमतौर पर, आप अपने बाइनरी डेटा को एक प्रसिद्ध प्रारूप में लपेटते हैं, उदाहरण के लिए बाद वाले डेटा का वर्णन करने वाले एक निश्चित शीर्षलेख के साथ। यदि आप डेटा की अज्ञात धारा में डिलीमीटर खोजने की कोशिश कर रहे हैं, तो आमतौर पर आपको एक बचने की अनुक्रम की आवश्यकता होती है। उदाहरण के लिए, एचडीएलसी जैसे कुछ, जहां 0x7E फ्रेम डिलीमीटर है। डेटा को एन्कोड किया जाना चाहिए कि यदि डेटा के अंदर 0x7E है, तो इसे मूल डेटा के एक्सओआर के बाद 0x7D के साथ बदल दिया गया है। डेटा स्ट्रीम में 0x7D इसी तरह से बच निकला है।

3

यदि बाइनरी रिकॉर्ड में वास्तव में कोई डेटा हो सकता है, तो डेटा के बाद मार्कर के बजाय डेटा से पहले लंबाई जोड़ने का प्रयास करें। इसे कभी-कभी उपसर्ग लंबाई कहा जाता है क्योंकि लंबाई डेटा से पहले आती है।

अन्यथा, आपको बाइट स्ट्रीम (और भागने अनुक्रम से बचने) में डेलीमीटर से बचना होगा।

3

आप इससे पहले बाइनरी डेटा का आकार पूर्ववत कर सकते हैं। यदि आप स्ट्रीम किए गए डेटा से निपट रहे हैं और पहले से ही इसका आकार नहीं जानते हैं, तो आप इसे टुकड़ों में विभाजित कर सकते हैं और प्रत्येक खंड आकार क्षेत्र के साथ शुरू कर सकते हैं।

यदि आप एक हिस्से के लिए अधिकतम आकार निर्धारित करते हैं, तो आप आखिरी हिस्से के साथ समाप्त हो जाएंगे, लेकिन यादृच्छिक पहुंच को सरल बनाने के लिए आपको इसकी आवश्यकता होगी।

10

आप पांच विकल्प हैं:

  • परिसीमक चरित्र है कि हो की संभावना नहीं है का उपयोग करें। यह गलत तरीके से अनुमान लगाने का जोखिम चलाता है। मैं इस दृष्टिकोण की सिफारिश नहीं करता हूं।
  • डेलीमीटर को शामिल करने के लिए एक डेलीमीटर वर्ण और escape sequence का उपयोग करें। आसान पार्सिंग के आधार पर आपको बचने वाले चरित्र को दोगुना करने की आवश्यकता हो सकती है। (कुछ सामग्री में ASCII NUL शामिल करने के लिए सी \0 के बारे में सोचें।)
  • एक डिलीमीटर वाक्यांश का उपयोग करें जो आप निर्धारित नहीं कर सकते हैं। (mime message boundaries के बारे में सोचें।)
  • किसी प्रकार के लंबाई फ़ील्ड तैयार करें, ताकि आप निम्नलिखित एन बाइट्स को डेटा के रूप में पढ़ सकें। इस डेटा को लिखने से पहले को जानने की आवश्यकता है, जो कभी-कभी मुश्किल या असंभव होता है।
  • जैसे कुछ अधिक जटिल का उपयोग करें, सभी आपके लिए आपकी सामग्री का पूरी तरह से वर्णन करने के लिए। (मुझे नहीं पता कि मैं वास्तव में इसकी सिफारिश करता हूं कि आप अच्छा इसका उपयोग कर सकते हैं - ASN.1 सर्वोत्तम परिस्थितियों में उपयोग करने के लिए अजीब है, लेकिन यह पूरी तरह से अस्पष्ट बाइनरी डेटा व्याख्या की अनुमति देता है।)
संबंधित मुद्दे