(1) বাইট সিকোয়েন্স বলতে কী বোঝায়, সি তে একটি অ্যারে? ইউটিএফ -16 একটি বাইট সিকোয়েন্স বা এটি তখন কী? (২) বাইট সিকোয়েন্সের পরিবর্তনশীল দৈর্ঘ্যের সাথে কোনও সম্পর্ক নেই কেন?
আপনি এন্ডিয়ান সমস্যাগুলি কী তা বোঝা যাচ্ছে বলে মনে হচ্ছে। এখানে একটি সংক্ষিপ্তসার।
একটি 32-বিট পূর্ণসংখ্যা 4 বাইট নেয় takes এখন, আমরা এই বাইটগুলির যৌক্তিক ক্রম জানি know আপনার যদি 32-বিট পূর্ণসংখ্যা থাকে তবে আপনি নীচের কোড সহ এর উচ্চ বাইটটি পেতে পারেন:
uint32_t value = 0x8100FF32;
uint8_t highByte = (uint8_t)((value >> 24) & 0xFF); //Now contains 0x81
সব ঠিক আছে এবং ভাল। সমস্যাটি যেখানে শুরু হয় তা হ'ল বিভিন্ন হার্ডওয়্যার কীভাবে মেমরি থেকে পূর্ণসংখ্যার সঞ্চয় করে।
বিগ এন্ডিয়ান ক্রমানুসারে, আপনি 32-বিট সংখ্যার হিসাবে যে 4 মাইট মেমরি পড়েছেন তা প্রথম বাইটটি উচ্চ বাইট হওয়ার সাথে পড়বে:
[0][1][2][3]
লিটল এন্ডিয়ান অর্ডারে, আপনি 32-বিট ইন্টিজার হিসাবে যে 4 মাইট মেমরি পড়েছেন তা প্রথম বাইটটি লো বাইট হওয়ার সাথে পড়বে :
[3][2][1][0]
আপনার যদি 32-বিট মানটির একটি পয়েন্টারটিতে একটি পয়েন্টার থাকে তবে আপনি এটি করতে পারেন:
uint32_t value = 0x8100FF32;
uint32_t *pValue = &value;
uint8_t *pHighByte = (uint8_t*)pValue;
uint8_t highByte = pHighByte[0]; //Now contains... ?
সি / সি ++ অনুসারে এর ফলাফল অপরিবর্তিত। এটি 0x81 হতে পারে। অথবা এটি 0x32 হতে পারে। প্রযুক্তিগতভাবে, এটি কোনও কিছু ফিরিয়ে দিতে পারে তবে বাস্তব সিস্টেমগুলির জন্য এটি এক বা অন্যটিতে ফিরে আসবে।
আপনার যদি কোনও মেমরি ঠিকানার পয়েন্টার থাকে তবে আপনি সেই ঠিকানাটি 32-বিট মান, 16-বিট মান, বা 8-বিট মান হিসাবে পড়তে পারেন। একটি বড় এন্ডিয়ান মেশিনে, পয়েন্টারটি উচ্চ বাইটের দিকে নির্দেশ করে; একটু এন্ডিয়ান মেশিনে, পয়েন্টারটি নিম্ন বাইটের দিকে নির্দেশ করে।
মনে রাখবেন যে এটি মেমরি থেকে / পাঠানো এবং লেখার বিষয়ে। এর অভ্যন্তরীণ সি / সি ++ কোডের সাথে কোনও সম্পর্ক নেই । কোডটির প্রথম সংস্করণ, যা সি / সি ++ অপরিবর্তিত হিসাবে ঘোষণা করে না, উচ্চ বাইট পেতে সর্বদা কাজ করবে ।
সমস্যাটি যখন আপনি বাইট স্ট্রিমগুলি পড়া শুরু করেন। যেমন একটি ফাইল থেকে।
16-বিট মানগুলিতে 32-বিট মান হিসাবে একই সমস্যা রয়েছে; 4 এর পরিবর্তে তাদের কেবল 2 বাইট রয়েছে Therefore সুতরাং, কোনও ফাইলে বড় এন্ডিয়ান বা সামান্য এন্ডিয়ান অর্ডারে সঞ্চিত 16-বিট মান থাকতে পারে।
ইউটিএফ -16 16 বিট মানগুলির ক্রম হিসাবে সংজ্ঞায়িত করা হয়েছে । কার্যকরভাবে, এটি একটি uint16_t[]
। প্রতিটি স্বতন্ত্র কোড ইউনিট একটি 16-বিট মান। সুতরাং, ইউটিএফ -16 যথাযথভাবে লোড করার জন্য আপনাকে অবশ্যই জানতে হবে যে ডেটাটির এন্ডিয়ান-নেসটি।
ইউটিএফ -8 8 বিট মানগুলির ক্রম হিসাবে সংজ্ঞায়িত করা হয় । এটি একটি uint8_t[]
। প্রতিটি স্বতন্ত্র কোড ইউনিট 8-বিট আকারের: একক বাইট।
এখন, উভয় হল UTF-16 এবং হল UTF-8 একাধিক কোড ইউনিট (16 বিট বা 8-বিট মান) একসঙ্গে মেশা করার জন্য একটি ইউনিকোড কোডপয়েন্ট (একটি "চরিত্র" গঠন করতে, কিন্তু যে জন্য অনুমতি না এটা একটা সরলীকৃত ব্যবস্থা; সঠিক শব্দটি )। অর্ডার এই কোড ইউনিট করে একটি কোডপয়েন্ট গঠন হল UTF-16 এবং হল UTF-8 এনকোডিং দ্বারা dictated করা হয়।
ইউটিএফ -16 প্রক্রিয়াকরণ করার সময়, আপনি 16-বিট মান পড়েন, এন্ডিয়ান রূপান্তরটি যা প্রয়োজন তা-ই করে। তারপরে, আপনি সনাক্ত করতে পারেন যে এটি কোনও সারোগেট জুটি কিনা; যদি এটি হয় তবে আপনি অন্য 16-বিট মানটি পড়বেন, দুটি একত্রিত করুন এবং সেখান থেকে আপনি ইউনিকোড কোডপয়েন্ট মান পাবেন।
ইউটিএফ -8 প্রক্রিয়াকরণের সময় আপনি একটি 8-বিট মান পড়েন। কোনও এন্ডিয়ান রূপান্তর সম্ভব নয়, যেহেতু কেবলমাত্র একটি বাইট রয়েছে। যদি প্রথম বাইটটি একটি বহু-বাইট অনুক্রমকে চিহ্নিত করে, তবে আপনি বহু-বাইট ক্রম দ্বারা নির্ধারিত হিসাবে কিছু সংখ্যক বাইটগুলি পড়েন। প্রতিটি পৃথক বাইট একটি বাইট এবং অতএব এন্ডিয়ান রূপান্তর নেই। অর্ডার এগুলোর ক্রমানুসারে বাইট, ঠিক যেমন হল UTF-16 ভাড়াটে যুগলের আদেশ, হল UTF-8 দ্বারা সংজ্ঞায়িত করা হয়।
সুতরাং ইউটিএফ -8 এর সাথে কোনও এন্ডিয়ান সমস্যা থাকতে পারে না।