2013-01-06 58 views
10

बनाता है यह परिवर्तित समारोहपरिवर्तित स्ट्रिंग [] बाइट के लिए शून्य चरित्र

public static byte[] GetBytes(string str) 
{ 
    byte[] bytes = new byte[str.Length * sizeof(char)]; 
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
    return bytes; 
} 

byte[] test = GetBytes("abc"); 

जिसके परिणामस्वरूप सरणी शून्य चरित्र

test = [97, 0, 98, 0, 99, 0] 

शामिल में और जब हम परिवर्तित बाइट [] वापस स्ट्रिंग के लिए, परिणाम है

string test = "a b c " 

हम इसे कैसे कर सकता हूँ तो यह उन शून्य पैदा नहीं करता

+1

जब आप एक बाइट सरणी में वर्ण की नकल की .. एन्कोडिंग किस तरह * कर आपने किसी कारण से मालूम होता है उन शून्य बनाया तरीके से अलग होगा * तुम्हें चाहिए? ASCII? UTF-8? – harold

+0

संभावित डुप्लिकेट [बाइट \ [\]] से लौट फ़ाइल डाउनलोड करें (http://stackoverflow.com/questions/14158804/return-file-download-from-byte) – Esailija

+2

ToCharArray, जैसा कि नाम कहता है, char [] । एक चार 16 बिट्स है, यानी 2 बाइट्स। तो आपको सरल ASCII पाठ के लिए भी मूल्य 0 के साथ एक अतिरिक्त बाइट मिलता है। – Chris

उत्तर

6

पहले के को देखो आपका कोड क्या गलत करता है। char .NET ढांचे में 16-बिट (2 बाइट) है। जिसका अर्थ है कि जब आप sizeof(char) लिखते हैं, तो यह 2 देता है। str.Length1 है, इसलिए वास्तव में आपका कोड byte[] bytes = new byte[2] होगा byte[2]। तो जब आप Buffer.BlockCopy() विधि का उपयोग करते हैं, तो आप वास्तव में एक स्रोत सरणी से गंतव्य सरणी में 2 बाइट कॉपी करते हैं। जिसका अर्थ है कि आपकी GetBytes() विधि bytes[0] = 32 और bytes[1] = 0 लौटाती है यदि आपकी स्ट्रिंग " " है।

इसके बजाय Encoding.ASCII.GetBytes() का उपयोग करने का प्रयास करें।

जब एक व्युत्पन्न वर्ग में अधिरोहित, बाइट्स के अनुक्रम में रखता निर्दिष्ट स्ट्रिंग में सभी पात्रों को कूटबद्ध।

const string input = "Soner Gonul"; 

byte[] array = Encoding.ASCII.GetBytes(input); 

foreach (byte element in array) 
{ 
    Console.WriteLine("{0} = {1}", element, (char)element); 
} 

आउटपुट:

83 = S 
111 = o 
110 = n 
101 = e 
114 = r 
32 = 
71 = G 
111 = o 
110 = n 
117 = u 
108 = l 
0

स्पष्ट रूप से Encoding निर्दिष्ट करने का प्रयास करें। आप निर्दिष्ट एन्कोडिंग के साथ बाइट्स स्ट्रिंग परिवर्तित करने के लिए अगले कोड का उपयोग कर सकते

byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abc"); 

अगर आप बाइट्स की सामग्री मुद्रित, आप { 97, 98, 99 } जो शून्य शामिल नहीं है, अपने उदाहरण में के रूप में मिल जाएगा 16 का उपयोग कर अपने उदाहरण में डिफ़ॉल्ट एन्कोडिंग प्रति प्रतीक बिट्स। यह तब

System.Text.Encoding.Unicode.GetBytes("abc"); // { 97, 0, 98, 0, 99, 0 } 

के परिणाम मुद्रण द्वारा पर्यवेक्षक हो सकता है, जबकि इसे वापस परिवर्तित करने के लिए, आप उचित एन्कोडिंग का चयन करना चाहिए:

string str = System.Text.Encoding.ASCII.GetString(bytes); 
Console.WriteLine (str); 

प्रिंटों "abc" के रूप में आप की उम्मीद हो सकती है

+1

या गेटबाइट्स से प्राप्त किए गए चीज़ों से वापस कनवर्ट करने के लिए यूनिकोड एन्कोडिंग का उपयोग करें: 'string str = System.Text.Encoding.Unicode.GetString (बाइट्स); 'फिर इसे गैर-असीसी के साथ भी काम करना चाहिए। फिर भी आपको हमेशा एन्कोडिंग को किसी भी तरह से निर्दिष्ट करना चाहिए: 'बाइट [] बाइट्स = System.Text.Encoding.Unicode.GetBytes ("abc");' ध्यान दें कि डिफ़ॉल्ट यूनिकोड एन्कोडिंग थोड़ा एंडियन है, यदि आप नेटवर्किंग और स्विचिंग करने की योजना बनाते हैं अंतहीनता या सी # की तुलना में अन्य भाषाओं के साथ काम करना। – Sardtok

+0

@ सार्डटोक धन्यवाद, मैंने एक एस्वर –

0

(97,0) 'एक' का यूनिकोड प्रतिनिधित्व है। यूनिकोड प्रत्येक बाइट को दो बाइट्स में दर्शाता है। तो आप शून्य को हटा नहीं सकते हैं। लेकिन आप एन्कोडिंग को एएससीआईआई में बदल सकते हैं। स्ट्रिंग को बाइट [] में कनवर्ट करने के लिए निम्न का प्रयास करें।

byte[] array = Encoding.ASCII.GetBytes(input); 
0

बस अपने उत्तर के बारे में भ्रम को दूर करने के लिए, सी # में चार प्रकार 2 बाइट लेते हैं। तो, string.toCharArray() एक सरणी देता है जिसमें प्रत्येक आइटम भंडारण के 2 बाइट लेता है। बाइट सरणी की प्रतिलिपि बनाते समय, जहां प्रत्येक आइटम 1 बाइट स्टोरेज लेता है, वहां डेटा हानि होती है। इसलिए परिणामस्वरूप शून्य दिखाई देते हैं।
जैसा कि सुझाव दिया गया है, Encoding.ASCII.GetBytes उपयोग करने के लिए एक सुरक्षित विकल्प है।

+0

अपडेट किया है कोई डेटा हानि नहीं है, यह प्रभावी रूप से 'एन्कोडिंग। यूनिकोड.गेटबाइट्स' जैसा ही कर रहा है जो यूटीएफ 16 लिटिल एंडियन के रूप में एन्कोडिंग कर रहा है। – Esailija

1

वास्तविकता .net में (4.0 के लिए कम से कम) स्वचालित रूप से चार का आकार बदल जाता है जब BinaryWriter साथ धारावाहिक

UTF-8 वर्ण चर लंबाई (1 बाइट नहीं हो सकता है) है, ASCII वर्ण 1 बाइट

है

'ई' = 2 बाइट्स

'ई' = 1 बाइट

यह का उपयोग करते समय ध्यान में रखा जाना चाहिए

BinaryReader.ReadChars(stream) 

= 7 बाइट्स शब्द "Evalds" के मामले में आकार "Evalds" = 6 बाइट्स

+0

"यूटीएफ -8 वर्णों में 2 बाइट्स हैं" ... क्या? यूटीएफ -8 एक चर-लंबाई एन्कोडिंग है। –

+0

स्पष्टीकरण के लिए धन्यवाद मैंने जवाब संपादित किया है –