मुझे आश्चर्य है कि यह पहले पोस्ट नहीं किया गया है!
लगातार ओवरहेड बाइट स्टफ़िंग (cobs) एल्गोरिथ्म परिसीमित बाइट धाराओं किया जाता है।
हम एक फ्रेम मार्कर चुनते हैं (हम 0x00 का उपयोग करेंगे) और जहां भी 0x00 स्ट्रीम में होता है उसे बाइट्स की संख्या के साथ बदल दिया जाता है जब तक कि अगला 0x00 होता है (हम इसे मील का पत्थर कहेंगे)। यह मानों की सीमा को 0..255 से घटाकर 1..255 तक कम कर देता है, जिससे 0x00 को स्ट्रीम में स्पष्ट रूप से परिसीमित फ्रेम में सक्षम किया जाता है।
एक मील के पत्थर पर, अगर अगले 255B में 0x00 शामिल नहीं है, तो यह अधिकतम मील का पत्थर की लंबाई से अधिक है - एल्गोरिथ्म को 255B पर 'स्टाल' करना होगा और दूसरा मील का पत्थर रखना होगा। यह 'सुसंगत ओवरहेड' है।
पहला बाइट पहला मील का पत्थर होगा, अंतिम मील का पत्थर फ्रेम मार्कर तक बाइट्स की संख्या होगी।
विकिपीडिया से कुछ उदाहरण (लेख को पढ़ने के लिए सबसे अच्छा है जहाँ वे रंगीन हैं):
0x00 as frame marker
Unencoded data (hex) Encoded with COBS (hex)
00 01 01 00
00 00 01 01 01 00
11 22 00 33 03 11 22 02 33 00
11 22 33 44 05 11 22 33 44 00
11 00 00 00 02 11 01 01 01 00
01 02 03 ... FD FE FF 01 02 03 ... FD FE 00
00 01 02 ... FC FD FE 01 FF 01 02 ... FC FD FE 00
01 02 03 ... FD FE FF FF 01 02 03 ... FD FE 02 FF 00
02 03 04 ... FE FF 00 FF 02 03 04 ... FE FF 01 01 00
03 04 05 ... FF 00 01 FE 03 04 05 ... FF 02 01 00
चुनौती: इसे कम से कम कार्यक्रम में लागू करना।
- इनपुट एक अनएन्कोडेड बाइट स्ट्रीम / सरणी है, आउटपुट एक एनकोडेड बाइट स्ट्रीम / एरे है
- किसी भी प्रकार के बाइनरी मानक इनपुट / आउटपुट का उपयोग करें
- अंतिम फ्रेम मार्कर आवश्यक नहीं है
- कार्यक्रम एक ओवरसाइज़्ड सरणी लौटा सकता है
- 254 गैर-शून्य बाइट्स के साथ समाप्त होने वाली धारा को अनुगामी 0x00 की आवश्यकता नहीं होती है
टिप्पणियाँ
- सबसे खराब स्थिति वापसी की लंबाई है
numBytes + (numBytes / 254) + 1
उदाहरण
हमारे पास बाइट सरणी है
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
प्रत्येक के लिए 0x00
हमें (एक मील के पत्थर में) स्टेट की जरूरत है, जहां अगला 0x00
होगा।
[0] 0x03 #Milestone. Refers to the original [2] - "The next 0x00 is in 3B"
[1] 0x01 #Original [0]
[2] 0x02 #Original [1]
[3] 0x04 #Milestone. Refers to the original [6] - "The next 0x00 is in 4B"
[4] 0x03 #
[5] 0x04 #
[6] 0x05 # Originals [3..5]
[7] 0x02 #Milestone. Refers to the end frame marker
[8] 0x06 #Original [7]
[9] 0x00 #Optional. End frame marker.
01
लेकिन दो हैं01
नौवें एक में एस (जहां एक शून्य के बाद 254 गैर-शून्य बाइट्स हैं)।