এটি একটি জনপ্রিয় প্রশ্ন। প্রশ্ন লেখক কী জিজ্ঞাসা করছেন তা বোঝা গুরুত্বপূর্ণ, এবং এটি সম্ভবত সবচেয়ে সাধারণ প্রয়োজনের থেকে পৃথক। কোডটির অপব্যবহার নিরুত্সাহ করার জন্য যেখানে এটির দরকার নেই, আমি পরে উত্তরটি দিয়েছি।
সাধারণ প্রয়োজন
প্রতিটি স্ট্রিংয়ের একটি অক্ষর সেট এবং এনকোডিং থাকে। আপনি যখন কোনও System.String
অবজেক্টকে একটি অ্যারেতে রূপান্তর করেন System.Byte
তখনও একটি অক্ষর সেট এবং এনকোডিং থাকে। বেশিরভাগ ব্যবহারের জন্য, আপনি কী অক্ষর সেট এবং এনকোডিং আপনার প্রয়োজন তা জানেন এবং NET এটি "রূপান্তর সহ অনুলিপি করা" সহজ করে তোলে। কেবল উপযুক্ত Encoding
ক্লাসটি বেছে নিন ।
// using System.Text;
Encoding.UTF8.GetBytes(".NET String to byte array")
রূপান্তরটির ক্ষেত্রে কেসটি হ্যান্ডেল করার প্রয়োজন হতে পারে যেখানে লক্ষ্য অক্ষর সেট বা এনকোডিং উত্সে থাকা কোনও অক্ষরকে সমর্থন করে না। আপনার কিছু পছন্দ আছে: ব্যতিক্রম, প্রতিস্থাপন বা এড়িয়ে যাওয়া। ডিফল্ট নীতি হ'ল '?' বিকল্পযুক্ত করা।
// using System.Text;
var text = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes("You win €100"));
// -> "You win ?100"
স্পষ্টতই, রূপান্তরগুলি অগত্যা ক্ষয়হীন নয়!
দ্রষ্টব্য: System.String
উত্স অক্ষরের জন্য সেটটি ইউনিকোড।
কেবল বিভ্রান্তকর বিষয় হ'ল .NET একটি অক্ষর সেটটির নাম ব্যবহার করে সেই অক্ষর সেটটির একটি নির্দিষ্ট এনকোডিংয়ের নাম ব্যবহার করে। Encoding.Unicode
বলা উচিত Encoding.UTF16
।
এটি বেশিরভাগ ব্যবহারের জন্যই। যদি এটি আপনার প্রয়োজন হয় তবে এখানে পড়া বন্ধ করুন। এনকোডিং কী তা যদি আপনি বুঝতে না পারেন তবে মজাদার জোয়েল স্পলস্কি নিবন্ধটি দেখুন ।
নির্দিষ্ট প্রয়োজন
এখন, প্রশ্ন লেখক জিজ্ঞাসা করেছেন, "প্রতিটি স্ট্রিং বাইটের অ্যারে হিসাবে সংরক্ষণ করা হয়, তাই না? কেন আমি কেবল এই বাইটগুলি রাখতে পারি না?"
সে কোনও রূপান্তর চায় না।
থেকে C # এর বৈশিষ্ট :
সি # তে অক্ষর এবং স্ট্রিং প্রসেসিং ইউনিকোড এনকোডিং ব্যবহার করে। চর প্রকারটি একটি ইউটিএফ -16 কোড ইউনিট উপস্থাপন করে এবং স্ট্রিং টাইপটি ইউটিএফ -16 কোড ইউনিটের ক্রম উপস্থাপন করে।
সুতরাং, আমরা জানি যে আমরা যদি নাল রূপান্তর চেয়েছি (অর্থাত্ ইউটিএফ -16 থেকে ইউটিএফ -16), আমরা পছন্দসই ফলাফল পাব:
Encoding.Unicode.GetBytes(".NET String to byte array")
তবে এনকোডিংয়ের উল্লেখ এড়াতে আমাদের অন্যভাবে এটি করতে হবে। যদি একটি মধ্যবর্তী ডেটা টাইপ গ্রহণযোগ্য হয় তবে এর জন্য একটি ধারণামূলক শর্টকাট রয়েছে:
".NET String to byte array".ToCharArray()
এটি আমাদের পছন্দসই ডেটাটাইপটি পায় না তবে মেহেরদাদের উত্তর দেখায় যে কীভাবে এই চর অ্যারেটিকে ব্লককপি ব্যবহার করে বাইট অ্যারেতে রূপান্তর করা যায় । যাইহোক, এই স্ট্রিং দুইবার অনুলিপি! এবং এটি খুব স্পষ্টভাবে এনকোডিং-নির্দিষ্ট কোড ব্যবহার করে: ডেটাটাইপ System.Char
।
স্ট্রিংটি স্ট্রিং থাকা প্রকৃত বাইটগুলি পাওয়ার একমাত্র উপায় পয়েন্টার ব্যবহার করা। fixed
বিবৃতি মূল্যবোধের ঠিকানা গ্রহণ করতে পারবেন। সি # স্পেস থেকে:
[এর জন্য] টাইপ স্ট্রিংয়ের একটি অভিব্যক্তি, ... আরম্ভকারী স্ট্রিংয়ের প্রথম অক্ষরের ঠিকানা গণনা করে।
এটি করতে, সংকলক স্ট্রিং অবজেক্টের সাথে অন্যান্য অংশের উপরে কোড স্কিপ লেখেন RuntimeHelpers.OffsetToStringData
। সুতরাং, কাঁচা বাইট পেতে, কেবল স্ট্রিংয়ের জন্য একটি পয়েন্টার তৈরি করুন এবং প্রয়োজনীয় বাইটের সংখ্যাটি অনুলিপি করুন।
// using System.Runtime.InteropServices
unsafe byte[] GetRawBytes(String s)
{
if (s == null) return null;
var codeunitCount = s.Length;
/* We know that String is a sequence of UTF-16 codeunits
and such codeunits are 2 bytes */
var byteCount = codeunitCount * 2;
var bytes = new byte[byteCount];
fixed(void* pRaw = s)
{
Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount);
}
return bytes;
}
@ কোডসইনচায়োস যেমন উল্লেখ করেছেন, ফলাফলটি মেশিনের শেষের উপর নির্ভর করে। তবে প্রশ্ন লেখক তাতে উদ্বিগ্ন নন।