ধারাবাহিক ওভারহেড বাইট স্টাফিং (সিওবিএস)


10

আমি অবাক হয়েছি এটি আগে পোস্ট করা হয়নি!

সঙ্গতিপূর্ণভাবে ওভারহেড বাইট ঠাসাঠাসি (খোসা) অ্যালগরিদম সীমানা বাইট স্ট্রিম করতে ব্যবহৃত হয়।

আমরা একটি ফ্রেম চিহ্নিতকারী চয়ন করি (আমরা 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.

3
আপনার সম্ভবত এটি অনুমানের মধ্যে অন্তর্ভুক্ত করা উচিত: একটি বিশেষ ব্যতিক্রম হিসাবে, যদি কোনও প্যাকেট 254 নন-শূন্য বাইটের একটি গ্রুপের সাথে শেষ হয়, তবে এটি শূন্য বাইটের পিছনে যুক্ত করার প্রয়োজন হবে না। এটি কিছু পরিস্থিতিতে একটি বাইট সংরক্ষণ করে। (উইকিপিডিয়া উদ্ধৃত করে)
আর্নল্ড

3
@ লুইস মেন্ডো সম্মত। এখন যেহেতু আমি সমস্ত পরীক্ষার ক্ষেত্রে দিয়েছি, আমি নিশ্চিত করতে পারি যে এটি বর্তমানে কিছুটা সংক্ষিপ্ত বিবরণযুক্ত।
আর্নউল্ড

@ আর্নল্ড, আমি বলেছি যে শেষ ফ্রেম প্রস্তুতকারকের যেভাবেই প্রয়োজন হয় না :)
প্যাট্রিক

উদাহরণস্বরূপ, প্রথম আউটপুট বাইট 0x03 হওয়া উচিত, 0x02 না হওয়া অবধি, যদি না আমার ভুল হয় ...
অলিভিয়ার গ্রাগোয়ার

1
@ অ্যারনল্ড 254 নন-শূন্য বাইট সহ শেষ হওয়ার বিশেষ ক্ষেত্রে: সম্মত হন, এবং এটি চূড়ান্ত ফ্রেম চিহ্নিতকারীটির জন্য পৃথক ইস্যু। এ কারণেই ষষ্ঠ উদাহরণটির পিছনে কিছু নেই 01তবে 01নবম একটিতে দুটি রয়েছে (যেখানে সেখানে শূন্যের পরে 254 নন-শূন্য বাইট রয়েছে)।
নিক কেনেডি

উত্তর:





1

জেলি , 27 বাইট

Oµ=0ks€254Ẏḟ€0L‘;Ɗ€F;Ṫ¬x`ƊỌ

এটি অনলাইন চেষ্টা করুন!

একটি মোনাডিক লিঙ্ক যা একটি আনইনকোডড বাইট অ্যারে ইনপুট হিসাবে নেয় এবং এনকোডেড বাইট অ্যারে প্রদান করে। নিয়ম অনুসারে, চূড়ান্ত ফ্রেম চিহ্নিতকারী বাদ দেওয়া হয়েছে।

ব্যাখ্যা

Oµ                          | Convert to integer and start a new monadic chain
  =0k                       | Split after zeros
     s€254                  | Split each list into length 254 lists
          Ẏ                 | Tighten (reduce list depth by 1)
           ḟ€0              | Filter zeros out from each list
              L‘;Ɗ€         | Prepend the list length plus one to each list
                   F        | Flatten
                    ;Ṫ¬x`Ɗ  | Append an additional 1 if the original list ended with zero
                          Ọ | Convert back to bytes


0

জে , 103 অক্ষর

লক্ষ করুন শেষ পরীক্ষার ফলাফলটি উইকি এবং অন্যান্য ভাষার চেয়ে আলাদা। এটি সীমানায় 254 তম শূন্য বাইটে এই পয়েন্টারটির কারণে। বিষয়গুলি অনেক সহজ হয়ে যায়, যদি এটি বিশেষ ক্ষেত্রে হিসাবে বিবেচনা না করা হয়।

f =: 3 : 0
  k =. I. (y,0)=0
  s =. - 2 (-/) \ k
  (>: y i. 0), s (}:k) } y
 )

 f2 =: 3 : 0
   f each _254 <\ y
 )

এটি অনলাইন চেষ্টা করুন


শেষ লাইনের শেষে ট্রেলিং স্পেসটি সরিয়ে আপনি এটি 1 বাইটে নামিয়ে নিতে পারেন ।
ওফ্লাক করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.