আমি অবাক হয়েছি এটি আগে পোস্ট করা হয়নি!
সঙ্গতিপূর্ণভাবে ওভারহেড বাইট ঠাসাঠাসি (খোসা) অ্যালগরিদম সীমানা বাইট স্ট্রিম করতে ব্যবহৃত হয়।
আমরা একটি ফ্রেম চিহ্নিতকারী চয়ন করি (আমরা 0x00 ব্যবহার করব) এবং যেখানে 0x00 প্রবাহে ঘটে সেখানে পরবর্তী 0x00 না হওয়া পর্যন্ত এটি বাইট সংখ্যার সাথে প্রতিস্থাপন করা হয় (আমরা এটিকে একটি মাইলফলক বলব)। এটি 0..255 থেকে 1..255 থেকে মানের পরিসর হ্রাস করে, 0x00 স্রোতে নির্বিঘ্নে ফ্রেমগুলি সীমিত করতে সক্ষম করে।
একটি মাইলফলকে, যদি পরবর্তী 255 বি 0x00 না থাকে তবে এটি সর্বাধিক মাইলফলক দৈর্ঘ্য অতিক্রম করে - অ্যালগরিদম অবশ্যই 255 বি তে 'স্টল' রেখে অন্য মাইলফলক স্থাপন করতে পারে। এটি 'নিয়মিত ওভারহেড'।
প্রথম বাইটটি হবে প্রথম মাইলফলক, চূড়ান্ত মাইলফলকটি ফ্রেম চিহ্নিতকারী হওয়া পর্যন্ত বাইটের সংখ্যা হবে।
উইকিপিডিয়া থেকে কিছু উদাহরণ (নিবন্ধটি যেখানে তারা রঙিন সেখানে পড়া ভাল):
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 নন-শূন্য বাইট রয়েছে)।