আপনি কীভাবে এএসসিআইআই স্ট্রিংকে কম বাইটে সংকুচিত করবেন?


12

আমি একটি অনন্য প্রোটোকল সহ এম্বেডড ডিভাইসের সাথে কাজ করছি যা অন্যান্য ডিভাইসে বার্তা প্রেরণ করে এবং আমি একটি অ্যাপ্লিকেশন তৈরি করছি যা প্রেরিত প্যাকেটগুলি পার্স করে। প্রতিটি প্যাকেট 8 বাইট বহন করে। প্রোটোকলটি প্রথম বাইট যেখানে শিরোনাম এবং বাকী 7 বাইট ডেটা হিসাবে নির্ধারিত হয়।

তারা একটি নির্দিষ্ট আইডি স্ট্রিং পাস করার চেষ্টা করছে তবে আইডি স্ট্রিংটি 8 টি অক্ষর দীর্ঘ (ASCII) তাই এটি 7 বাইটে ফিট করে না।

আমার সহকর্মী আমাকে যা বলেছিল তা হ'ল তারা আসল স্ট্রিংয়ের 8 এসকি বাইটগুলি পূর্ণসংখ্যায় (দশমিক) রূপান্তর করতে এবং আমাকে এর 4 বাইট প্রেরণ করতে চলেছে। তারা আমাকে বলেছিল যে আমার 4 টি বাইট থেকে মূল স্ট্রিংটি পাওয়া উচিত। আমি এই সম্পর্কে আমার মাথা মোড়ানো একটি কঠিন সময় পার করছি।

সুতরাং আপনার যদি "IO123456" এর মতো আইডি স্ট্রিং থাকে তবে এটি 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 এএসসিআই তে আছে .. পৃথিবীতে আপনি কীভাবে 4 টি বাইটে একটি সংখ্যায় পরিণত করে সংকোচন করতে পারেন এবং আমি এর থেকে মূল স্ট্রিংটি পেতে পারি ? আমি কি কিছু মিস করছি বা আমার সহকর্মী ভুল হয়ে গেছে? আমি বুঝতে পারি এটি একটি সত্যই বিজার প্রশ্ন তবে এটি গুরুত্ব সহকারে আমার কোনও ধারণা রাখে না।


1
প্রতিটি ASCII অক্ষরটি কেবল 7 টি বিট নেয়, সুতরাং 8 ASCII অক্ষরযুক্ত একটি স্ট্রিং সত্যই 8 * 7 বিট - 7 বাইটে সংরক্ষণ করা যায়।
লুস্কুবাল

উত্তর:


17

আইডিটি কি সর্বদা ফর্মটিতে থাকে: IO123456? আপনার সহকর্মীর অর্থ কী হতে পারে তা হ'ল তিনি কেবল একটি সংখ্যাযুক্ত অংশ প্রেরণ করেন যা "আইও" অংশটি বাদ দিয়ে 4 বাইটে সহজেই ফিট করে।


1
ইহা ওইটাই ছিল. প্রথম দুটি বাইট সর্বদা অক্ষরে থাকে এবং বাকী সংখ্যায় থাকে, সুতরাং এটি আপনি যেমনটি বলেছেন ঠিক তেমন 4 বাইটে ফিট করতে পারে। যদিও আমি জানি না যে নির্বিচারে 4 বাইটের সংখ্যাটি এসেছে কোথা থেকে, কারণ হেক্সে 999999 এফ 423 এফ তাই এটি সর্বোচ্চ 3 বাইট ..
l46kok

5
@ l46kok: 3-বাইট (24-বিট) পূর্ণসংখ্যক খুব বিরল, তাই সম্ভবত এটি 32-বিট (4-বাইট) পূর্ণসংখ্য হিসাবে প্রেরণ করা তাদের পক্ষে সহজ। আপনি এম্বেড থাকা ডিভাইসের স্থানীয় উপস্থাপনা (বাইট ক্রম) এ পেলে আমি সম্পূর্ণ অবাক হব না।
বার্ট ভ্যান ইনজেন শেহানাউ

16

যদি প্রথম দুটি অক্ষর ধ্রুবক না হয় (তবে সবসময় অক্ষর থাকে) এবং বাকী ছয়টি অক্ষর সর্বদা সংখ্যা হয় তবে "আইও 123456" এর মতো একটি স্ট্রিং সংখ্যাগুলি বাইনারি-কোডড দশমিক (বিসিডি) ফর্ম্যাটে রূপান্তর করে 5 বাইটে প্যাক করা যায় :

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
             |    |      \   /     \   /     \   /
            0x49 0x4f     0x12      0x34      0x56

যদি সম্ভাব্য শনাক্তকারীদের (প্রথম দুটি অক্ষর) সীমিত সেট থাকে তবে আপনি এগুলিকে একটি সংখ্যায় এনকোড করতে পারেন এবং পরিবর্তে এটি প্রেরণ করতে পারেন (যতক্ষণ না 256 এর বেশি সংমিশ্রণ রয়েছে), যেমন:

IO -> 0x00
RD -> 0x01
WT -> 0x02
   ...
AB -> 0x10
   ...
ZZ -> 0xff

যাতে মূল স্ট্রিংটি কোনও ক্ষতি না করেই 4 বাইটে প্যাক করা হয়:

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
              \    /     \   /     \   /     \   /
               0x00       0x12      0x34      0x56

আসল আইডি স্ট্রিং পেতে অবশ্যই এই প্রক্রিয়াটিও বিপরীত হতে পারে।


3

যদি স্ট্রিংটি অক্ষরের কোনও অনুক্রম হতে পারে:

  • যদি আপনি নিশ্চিত হতে পারেন যে আপনার স্ট্রিং প্রতিটি বাইটে সর্বাধিক উল্লেখযোগ্য বিট ব্যবহার না করে তবে আপনি প্রতিটি বিটটি সাতটি বিট করে কাটাতে পারেন এবং আপনার কাছে থাকা 56 বিটগুলিতে অবশিষ্ট 56 বিট স্থানান্তর করতে বিটওয়াইজ ক্রিয়াকলাপ ব্যবহার করতে পারেন।

  • যদি স্ট্রিংগুলি কেবলমাত্র অক্ষর এবং অঙ্ক থাকে তবে কেবলমাত্র সেটের 6-বিট উপস্থাপনা নিয়ে আসুন এবং আপনার সনাক্তকারীটির একটি 48-বিট স্ট্রিং তৈরি করুন।

যদি ফর্ম্যাটটি সর্বদা দুটি অক্ষর হয় তার পরে অঙ্কগুলির স্ট্রিং থাকে:

  • প্রথম দুটি বাইট একা ছেড়ে দিন এবং ছয়-বাইট পূর্ণসংখ্যার মধ্যে নম্বরটি এনকোড করুন। IO123456হয়ে 0x49 0x4f 0x01E240

  • প্রথম দুটি বাইট একা ছেড়ে দিন এবং বাইনারি কোডযুক্ত দশমিক হিসাবে অঙ্কগুলি প্যাক করুন । IO123456হয়ে 0x49 0x4f 0x12 0x34 0x56


1

এখানে পোস্ট করা প্রশ্নের প্রেক্ষাপট থেকে, এটি হার্ট নামক কিছু শিল্প প্রোটোকলের দিকে ইঙ্গিত করে। এই প্রোটোকলটির ASCII অক্ষর মোড়ানোর একটি অনন্য উপায় রয়েছে। একে প্যাকড-এএসসিআইআই বলা হয়। তবে এখনও এটি 8 টি অক্ষর 4 টি প্যাক করে না! প্যাকড-এএসসিআইআই অনুসারে, 8 টি এসসিআইআই বাইটগুলি 6. 4 থেকে 3 তে রূপান্তরিত হয়।

এই প্রোটোকলে, নির্দিষ্ট অনুরোধে পরামিতিগুলির দৈর্ঘ্য সর্বদা স্থির থাকে। সুতরাং বাকী অক্ষরগুলিকে স্পেস অক্ষর দ্বারা প্যাড করা দরকার। তবুও, এই সমস্ত জিনিস হার্ট-নির্দিষ্ট। আপনি যদি নিশ্চিত হয়ে থাকেন যে আপনি এটিতে কাজ করছেন তবে আমি প্যাকিং এবং আনপ্যাকিংয়ের সঠিক পদ্ধতিটি রেখে দেব।


0

সম্ভবত '0123456' একটি দীর্ঘ পূর্ণসংখ্যায় রূপান্তর করে।

তবে এটি কেবল সংখ্যা আইডিগুলির জন্য কাজ করবে।

অন্য একটি সম্ভাব্য স্কিমটি হ'ল আপনার 7 থেকে 6 বিট ইসসিএমএ -1 এনকোডিং রূপান্তর করা যা আপনাকে ছয় বাইট স্ট্রিং দেয় তবে আপনি অক্ষরের অক্ষরের উপরের অক্ষরের উপরের অক্ষর এবং বিরামচিহ্নের অক্ষরের একটি সীমিত সেট হয়ে থাকবেন।

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