2010-02-19 8 views
30

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो एक स्ट्रिंग को बेस 64 बाइट सरणी में परिवर्तित करता है।स्ट्रिंग को base64 बाइट सरणी में कनवर्ट करने के लिए, क्या यह मान्य होगा?

public byte[] stringToBase64ByteArray(String input) 
{ 
    byte[] ret = System.Text.Encoding.Unicode.GetBytes(input); 
    string s = Convert.ToBase64String(input); 
    ret = System.Text.Encoding.Unicode.GetBytes(s); 
    return ret; 
} 

इस समारोह के लिए एक वैध परिणाम (बशर्ते कि स्ट्रिंग यूनिकोड में है) का उत्पादन होगा: मैं इस दृष्टिकोण के साथ की कोशिश की है? धन्यवाद!

+1

बेस 64 बाइट सरणी क्या है? बेसएनएन टेक्स्ट प्रस्तुतियों पर लागू होता है। –

+1

@ हेंक: मुझे लगता है कि उसका मतलब है कि बेस 64 स्ट्रिंग को बाइट सरणी में परिवर्तित किया गया है। – Bobby

+0

ToBase64String बाइट [] प्रकार की अपेक्षा करता है, जबकि आप स्ट्रिंग – Adeel

उत्तर

18

ठीक दिखता है, हालांकि दृष्टिकोण अजीब है। लेकिन बेस 64 स्ट्रिंग को बाइट [] में कनवर्ट करने के लिए एन्कोडिंग.एएससीआईआई.जीटबाइट्स() का उपयोग करें। बेस 64 एन्कोडिंग में केवल ASCII वर्ण होते हैं। यूनिकोड का उपयोग करके आप प्रत्येक चरित्र के लिए अतिरिक्त 0 बाइट प्राप्त कर सकते हैं।

+0

Thanx! मैं आपकी सलाह का पालन करूंगा और इसके बजाय एन्कोडिंग.एएससीआईआई.जीटबाइट्स() का उपयोग करूंगा। –

2

स्ट्रिंग के रूप में प्रतिनिधित्व किए गए ब्लॉब के रूप में एक स्ट्रिंग का प्रतिनिधित्व करना अजीब है ... किसी भी कारण से आप सीधे स्ट्रिंग का उपयोग नहीं कर सकते हैं?

स्ट्रिंग हमेशा यूनिकोड है; यह एन्कोडेड बाइट्स है जो बदलता है। चूंकि बेस -64 हमेशा < 128 है, में यूनिकोड का उपयोग करके अंतिम भाग ओवरकिल लगता है (जब तक वायर-प्रारूप की मांग न हो)। निजी तौर पर, मैं पिछले GetBytes के लिए यूटीएफ 8 या ASCII का उपयोग करता हूं ताकि प्रत्येक बेस -64 वर्ण केवल एक बाइट लेता है।

+1

प्रदान कर रहे हैं हां, यह अजीब है। कारण मैं इसे कर रहा हूं क्योंकि मैं एक पुरानी विरासत प्रणाली के एपीआई में कॉल कर रहा हूं कि किसी कारण से स्ट्रिंग को बेस 64 बाइट एरे के रूप में पारित करना है। –

0

.NET में सभी स्ट्रिंग यूनिकोड हैं। यह कोड वैध परिणाम देगा लेकिन BASE64 स्ट्रिंग का उपभोक्ता भी यूनिकोड सक्षम होना चाहिए।

0

हां, यह आपके स्रोत स्ट्रिंग के यूटीएफ -16 छोटे-एंडियन प्रतिनिधित्व की आधार 64-एन्कोडेड स्ट्रिंग आउटपुट करेगा। ध्यान रखें कि, AFAIK, बेस 64 में यूटीएफ -16 का उपयोग करना वास्तव में आम नहीं है, ASCII या UTF-8 आमतौर पर उपयोग किया जाता है। हालांकि, यहां महत्वपूर्ण बात यह है कि प्रेषक और रिसीवर इस बात पर सहमत हैं कि किस एन्कोडिंग का उपयोग किया जाना चाहिए।

मुझे समझ में नहीं आता कि आप बाइट्स की सरणी में बेस 64 स्ट्रिंग को क्यों पुनर्स्थापित करते हैं: बेस 64 का उपयोग ट्रांसमीटर करते समय एन्कोडिंग असंगतताओं से बचने के लिए किया जाता है, इसलिए आपको एक स्ट्रिंग के रूप में रखना चाहिए और प्रोटोकॉल द्वारा उपयोग किए जाने वाले प्रारूप में इसे आउटपुट करना चाहिए डेटा संचारित करने के लिए। और, जैसा कि मार्क ने कहा था, उस उद्देश्य के लिए यूटीएफ -16 का उपयोग करना निश्चित रूप से अधिक है, क्योंकि बेस 64 में 128 के तहत सभी 64 वर्ण शामिल हैं।

52

आप उपयोग कर सकते हैं:

बाइट से [] स्ट्रिंग के लिए:

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

स्ट्रिंग से [] बाइट के लिए:

array = Convert.FromBase64String(result);

संबंधित मुद्दे