"स्ट्रिंग्स" और "बाइट्स": यह प्रोग्रामर के लिए हमेशा सिरदर्द क्यों है?
\nएक स्थिति की कल्पना करें: आप C# में एक नेटवर्क एप्लिकेशन लिख रहे हैं, सर्वर पर डेटा भेज रहे हैं, और आउटपुट में अक्षरों का गड़बड़झाला मिलता है। या आप पासवर्ड एन्क्रिप्ट करते हैं, और दूसरे छोर पर इसे डिक्रिप्ट नहीं किया जा सकता। परिचित लगता है? समस्या की जड़ अक्सर स्ट्रिंग को बाइट ऐरे (और वापस) में गलत रूपांतरण में छिपी होती है।
\nStack Overflow पर "Converting string to byte array in C#" प्रश्न ने हज़ारों व्यूज़ एकत्र किए हैं, यह कोई संयोग नहीं है। यह वह आधार है जिस पर फ़ाइलों के साथ काम करना, क्रिप्टोग्राफी, सीरियलाइज़ेशन और नेटवर्क संचार टिका हुआ है। इस विषय को समझे बिना, आप बार-बार एक ही गलती करेंगे। आइए एक बार और हमेशा के लिए समझ लें कि इसे सही तरीके से कैसे किया जाए।
\n\nस्ट्रिंग को सीधे बाइट्स में क्यों नहीं बदला जा सकता?
\nएक भोला तरीका है किसी कैरेक्टर के लिए BitConverter.GetBytes() का उपयोग करना? नहीं। समस्या यह है कि स्ट्रिंग एक अमूर्तता है जो कैरेक्टर (char, C# में 2 बाइट्स) से बनी होती है। जबकि बाइट ऐरे कच्चा डेटा है जो एन्कोडिंग पर निर्भर करता है।
UTF-8 एन्कोडिंग में एक ही कैरेक्टर 'A' 1 बाइट लेगा, UTF-16 में 2 बाइट्स, और UTF-32 में 4 बाइट्स। यदि आप गलत एन्कोडिंग चुनते हैं, तो डेटा खो जाएगा। मुख्य नियम याद रखें: हमेशा एन्कोडिंग स्पष्ट रूप से निर्दिष्ट करें।
\n\nसबसे लोकप्रिय तरीका: Encoding.UTF8.GetBytes()
\nयह वही है जिसका उपयोग आप 90% मामलों में करेंगे। UTF-8 वेब, JSON और अधिकांश API के लिए डी-फैक्टो मानक है।
\n\nusing System;\nusing System.Text;\n\nclass Program\n{\n static void Main()\n {\n string original = "Привет, мир! 🌍";\n \n // स्ट्रिंग को बाइट ऐरे में बदलें (UTF-8)\n byte[] utf8Bytes = Encoding.UTF8.GetBytes(original);\n \n // वापस रूपांतरण (जाँच के लिए)\n string restored = Encoding.UTF8.GetString(utf8Bytes);\n \n Console.WriteLine($"मूल स्ट्रिंग: {original}");\n Console.WriteLine($"बाइट ऐरे (लंबाई {utf8Bytes.Length}): {BitConverter.ToString(utf8Bytes)}");\n Console.WriteLine($"पुनर्स्थापित स्ट्रिंग: {restored}");\n }\n}\n\nआउटपुट:
\nमूल स्ट्रिंग: Привет, мир! 🌍\nबाइट ऐरे (लंबाई 18): D0-9F-D1-80-D0-B8-D0-B2-D0-B5-D1-82-2C-20-D0-BC-D0-B8-D1-80-21-20-F0-9F-8C-8D\nपुनर्स्थापित स्ट्रिंग: Привет, мир! 🌍\n\nध्यान दें: इमोजी "🌍" 4 बाइट्स (F0-9F-8C-8D) लेता है। UTF-8 पुरानी एन्कोडिंग के विपरीत, यूनिकोड के किसी भी कैरेक्टर के साथ काम कर सकता है।
\n\nअन्य लोकप्रिय एन्कोडिंग
\n- \n
- Encoding.ASCII — केवल 7-बिट कैरेक्टर (0-127)। सिरिलिक या विशेष कैरेक्टर के लिए उपयुक्त नहीं है — 127 से ऊपर का सब कुछ '?' में बदल जाएगा। \n
- Encoding.Unicode (जिसे UTF-16LE भी कहा जाता है) — C# के अंदर स्ट्रिंग्स को स्टोर करने के लिए उपयोग किया जाता है। प्रत्येक कैरेक्टर 2 बाइट्स (या सरोगेट जोड़े के लिए 4) लेता है। \n
- Encoding.UTF32 — प्रत्येक कैरेक्टर सख्ती से 4 बाइट्स। संसाधन-गहन लेकिन अनुमानित। \n
- Encoding.Default — सिस्टम एन्कोडिंग (ANSI)। इससे बचें! यह अलग-अलग कंप्यूटरों पर अलग होती है। \n
BitConverter और MemoryStream के साथ रूपांतरण
\nकभी-कभी स्ट्रिंग का "कच्चा" प्रतिनिधित्व कैरेक्टर (char) ऐरे के रूप में प्राप्त करना आवश्यक होता है। यह एन्कोडेड बाइट्स के समान नहीं है, लेकिन निम्न-स्तरीय कार्य के लिए उपयोगी हो सकता है।
\n\nstring text = "C#";\n// char ऐरे प्राप्त करें\nchar[] chars = text.ToCharArray();\n// प्रत्येक char को 2 बाइट्स में बदलें (Little-Endian)\nbyte[] rawBytes = new byte[chars.Length * sizeof(char)];\nBuffer.BlockCopy(chars, 0, rawBytes, 0, rawBytes.Length);\n\nConsole.WriteLine(BitConverter.ToString(rawBytes)); // 43-00-23-00\n\nयह विधि UTF-16LE एन्कोडिंग में एक ऐरे देती है (जैसा कि मेमोरी में संग्रहीत होता है)। इसका उपयोग केवल तभी करें जब आपको ठीक-ठीक पता हो कि आप क्या कर रहे हैं।
\n\nविशेष मामला: Base64
\nयदि