यह एक लोकप्रिय प्रश्न है। यह समझना महत्वपूर्ण है कि प्रश्न लेखक क्या पूछ रहा है, और यह उस बात से अलग है जो संभवतः सबसे आम जरूरत है। उस कोड के दुरुपयोग को हतोत्साहित करने के लिए जहां इसकी आवश्यकता नहीं है, मैंने पहले उत्तर दिया है।
सामान्य आवश्यकता
प्रत्येक स्ट्रिंग में एक वर्ण सेट और एन्कोडिंग है। जब आप 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
।
यह सबसे usages के लिए है। यदि आपकी जरूरत है, तो यहां पढ़ना बंद करें। मज़ेदार जोएल स्पोलस्की लेख देखें यदि आपको समझ नहीं आता है कि एन्कोडिंग क्या है।
विशिष्ट आवश्यकता है
अब, सवाल लेखक पूछता है, "हर स्ट्रिंग को बाइट्स की एक सरणी के रूप में संग्रहीत किया जाता है, सही? मैं बस उन बाइट्स को क्यों नहीं कर सकता?"
वह कोई रूपांतरण नहीं चाहता है।
से सी # कल्पना :
सी # में चरित्र और स्ट्रिंग प्रसंस्करण यूनिकोड एन्कोडिंग का उपयोग करता है। Char प्रकार एक UTF-16 कोड इकाई का प्रतिनिधित्व करता है, और स्ट्रिंग प्रकार UTF-16 कोड इकाइयों के अनुक्रम का प्रतिनिधित्व करता है।
इसलिए, हम जानते हैं कि यदि हम अशक्त रूपांतरण (यानी UTF-16 से UTF-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;
}
जैसा कि @CodesInChaos ने बताया, परिणाम मशीन की समाप्ति पर निर्भर करता है। लेकिन प्रश्न लेखक का इससे कोई सरोकार नहीं है।