ট্র্যাক
/
C#
C#
/
অনুশীলনী
/
হাইপার-অপ্টিমাইজড টেলিমেট্রি
হাইপার-অপ্টিমাইজড টেলিমেট্রি

হাইপার-অপ্টিমাইজড টেলিমেট্রি

লার্নিং অনুশীলনী

ভূমিকা

ইন্টিজার সংখ্যা

C# ভাষা, অনেক স্ট্যাটিক টাইপড ভাষার মতো, এমন কিছু টাইপ সরবরাহ করে যেগুলো ইন্টিজার উপস্থাপন করে, আর প্রত্যেকটির নিজস্ব মানের পরিসর থাকে। সবচেয়ে ছোট প্রান্তে, sbyte টাইপের সর্বনিম্ন মান -128 এবং সর্বোচ্চ মান 127। সব ইন্টিজার টাইপের মতোই এই মানগুলো <type>.MinValue এবং <type>.MaxValue হিসেবে পাওয়া যায়। সবচেয়ে বড় প্রান্তে, long টাইপের সর্বনিম্ন মান -9,223,372,036,854,775,808 এবং সর্বোচ্চ মান 9,223,372,036,854,775,807। আর এদের মাঝখানে রয়েছে short এবং int টাইপ।

এই পরিসরগুলো নির্ধারিত হয় টাইপের স্টোরেজ প্রস্থ দিয়ে, যা সিস্টেম বরাদ্দ করে। উদাহরণস্বরূপ, একটি byte ৮ বিট ব্যবহার করে এবং একটি long ৬৪ বিট ব্যবহার করে।

উপরের প্রতিটি টাইপের সাথে একটি আনসাইনড সমতুল্য টাইপ জোড়া লাগানো আছে: sbyte/byte, short/ushort, int/uint এবং long/ulong। সব ক্ষেত্রেই মানের পরিসর 0 থেকে নেগেটিভ সাইনড সর্বোচ্চ মানের দুই গুণ যোগ এক পর্যন্ত।

টাইপ প্রস্থ সর্বনিম্ন সর্বোচ্চ
sbyte 8 bit -128 +127
short 16 bit -32_768 +32_767
int 32 bit -2_147_483_648 +2_147_483_647
long 64 bit -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte 8 bit 0 +255
ushort 16 bit 0 +65_535
uint 32 bit 0 +4_294_967_295
ulong 64 bit 0 +18_446_744_073_709_551_615

একটি টাইপের একটি ভ্যারিয়েবল (বা এক্সপ্রেশন) সহজেই আরেকটি টাইপে রূপান্তর করা যায়। যেমন, একটি অ্যাসাইনমেন্ট অপারেশনে, যদি যে মানটি অ্যাসাইন করা হচ্ছে তার টাইপ (lhs) নিশ্চিত করে যে মানটি যে টাইপে অ্যাসাইন করা হচ্ছে (rhs) তার পরিসরের মধ্যে থাকবে, তাহলে সেটি একটি সরল অ্যাসাইনমেন্ট:

uint ui = uint.MaxValue;
ulong ul = ui;    // no problem

অন্যদিকে, যদি যে টাইপ থেকে অ্যাসাইন করা হচ্ছে তার পরিসর গ্রহণকারী টাইপের মানের পরিসরের একটি উপসেট না হয়, তাহলে একটি কাস্ট, () অপারেশন প্রয়োজন, এমনকি নির্দিষ্ট মানটি গ্রহণকারী টাইপের পরিসরের মধ্যেই থাকলেও:

short s = 42;
uint ui = (uint)s;

বিট রূপান্তর

BitConverter ক্লাস ইন্টিজার টাইপকে বাইটের অ্যারেতে এবং অ্যারে থেকে বাইটে রূপান্তর করার একটি সুবিধাজনক উপায় দেয়।

নির্দেশনা

রিমোট কন্ট্রোল কার প্রকল্পে কাজ চলছে। টেলিমেট্রি সিস্টেমে ব্যান্ডউইথ খুবই সীমিত, আর আপনাকে টেলিমেট্রি ডেটা আদান-প্রদানের জন্য একটি মেসেজ প্রোটোকল তৈরি করতে বলা হয়েছে।

ডেটা একটি বাফারে (বাইট অ্যারে) পাঠানো হয়। ইন্টিজার পাঠানোর সময় নিচে বর্ণিত প্রোটোকল ব্যবহার করে বাফারের আকার কমিয়ে আনা হয়।

প্রতিটি মানকে সম্ভব হলে সবচেয়ে ছোট ইন্টিগ্রাল টাইপে উপস্থাপন করা উচিত (byte ও sbyte টাইপ অন্তর্ভুক্ত নয়, কারণ এতে সঞ্চয় নগণ্য হবে):

From To Type
4_294_967_296 9_223_372_036_854_775_807 long
2_147_483_648 4_294_967_295 uint
65_536 2_147_483_647 int
0 65_535 ushort
-32_768 -1 short
-2_147_483_648 -32_769 int
-9_223_372_036_854_775_808 -2_147_483_649 long

মানটিকে তার নির্ধারিত টাইপের জন্য উপযুক্ত সংখ্যক বাইটে রূপান্তর করতে হবে। সম্পূর্ণ বাফারে বাফারের অতিরিক্ত কতগুলি বাইট আছে তা নির্দেশ করা একটি বাইট (prefix byte) থাকে, তারপর ইন্টিজার ধারণ করা বাইটগুলি (payload bytes) থাকে।

কিছু টাইপ একই সংখ্যক বাইট ব্যবহার করে (যেমন uint ও int টাইপ)। সাধারণত তাদের prefix byte একই হতো, কিন্তু তাহলে ডিকোডিং সমস্যাযুক্ত হয়ে যেত। এটি সামলাতে প্রোটোকল একটি ছোট কৌশল ব্যবহার করে: সাইনড টাইপের ক্ষেত্রে তাদের prefix byte-এর মান হয় বাফারের অতিরিক্ত বাইটের সংখ্যা বাদ দিয়ে 256।

যোগাযোগে কেবল প্রিফিক্স বাইট এবং প্রিফিক্সে নির্দেশিত পরবর্তী বাইটগুলিই পাঠানো হয়। অভ্যন্তরীণভাবে পাঠানোর ও গ্রহণের রুটিন দুটোতেই একটি ৯ বাইটের বাফার ব্যবহার করা হয় (প্রয়োজনে শেষে শূন্য যুক্ত করে)।

1. পাঠানোর জন্য প্রস্তুত একটি ইন্টিগ্রাল মান এনকোড করুন

মেথডে পাস করা প্যারামিটারটি নিয়ে একটি বাফার এনকোড করতে অনুগ্রহ করে স্ট্যাটিক মেথড TelemetryBuffer.ToBuffer() ইমপ্লিমেন্ট করুন।

// Type: ushort, bytes: 2, signed: no, prefix byte: 2
TelemetryBuffer.ToBuffer(5)
// => {0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };

// Type: int, bytes: 4, signed: yes, prefix byte: 256 - 4
TelemetryBuffer.ToBuffer(Int32.MaxValue)
// => {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 };

2. গৃহীত একটি বাফার ডিকোড করুন

গৃহীত বাফারটি ডিকোড করে একটি long আকারে মান রিটার্ন করতে অনুগ্রহ করে স্ট্যাটিক মেথড TelemetryBuffer.FromBuffer() ইমপ্লিমেন্ট করুন।

TelemetryBuffer.FromBuffer(new byte[] {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 })
// => 2147483647

প্রিফিক্স বাইটের মান অপ্রত্যাশিত হলে 0 রিটার্ন করা উচিত।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
C# Exercism

হাইপার-অপ্টিমাইজড টেলিমেট্রি শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।