मैं एक बेस 64 स्ट्रिंग को कैसे एनकोड और डीकोड कर सकता हूं?


885
  1. मैं एक स्ट्रिंग दी गई एक बेस 64 एनकोडेड स्ट्रिंग कैसे लौटा सकता हूं?

  2. मैं एक स्ट्रिंग में एक बेस 64 एन्कोडेड स्ट्रिंग को कैसे डीकोड कर सकता हूं?


4
यदि यह "ज्ञान साझा करना" सवाल और जवाब है, तो मुझे लगता है कि हम कुछ अधिक गहराई से देख रहे हैं। इसके अलावा SO की त्वरित खोज होती है: stackoverflow.com/a/7368168/419
केव

1
@Gnark किसी भी स्ट्रिंग को एक निश्चित अंतर्निहित बिट-एन्कोडिंग स्कीमा द्वारा एन्कोड किया गया है। यह ASCII, UTF7, UTF8 हो, .... यह सवाल सबसे अधूरा है।
लॉरेंज लो सॉयर

2
अपने आप से पूछें कि क्या आपको वास्तव में ऐसा करने की आवश्यकता है? याद रखें कि आधार 64 मुख्य रूप से एएससीआईआई में द्विआधारी डेटा का प्रतिनिधित्व करने के लिए है, एक डेटाबेस में चार फ़ील्ड में संग्रहीत करने या ईमेल के माध्यम से भेजने के लिए (जहां नई लाइनें इंजेक्ट की जा सकती हैं)। क्या आप वास्तव में चरित्र डेटा लेना चाहते हैं, इसे बाइट्स में रूपांतरित करते हैं, फिर इसे चरित्र डेटा में परिवर्तित करते हैं, इस बार अपठनीय है और मूल एन्कोडिंग का कोई संकेत नहीं है?
bbsimonbb

हमें मूल एन्कोडिंग के बारे में क्यों ध्यान रखना चाहिए? हम स्ट्रिंग को यूटीएफ 8 प्रतिनिधित्व का उपयोग करके बाइट्स में एन्कोड करते हैं, जो सभी संभावित स्ट्रिंग वर्णों का प्रतिनिधित्व कर सकते हैं। हम फिर उस डेटा को क्रमबद्ध करते हैं और दूसरे छोर पर हम उस डेटा को डिसेर्बलाइज करते हैं और हम उसी स्ट्रिंग को फिर से बनाते हैं जो हमारे पास मूल रूप से थी (स्ट्रिंग ऑब्जेक्ट वैसे भी उपयोग किए गए एन्कोडिंग के बारे में जानकारी नहीं रखता है)। तो क्यों इस्तेमाल किया एन्कोडिंग से संबंधित कोई चिंता है? हम इसे क्रमबद्ध डेटा का प्रतिनिधित्व करने के एक मालिकाना तरीके की तरह मान सकते हैं, जिसे हमें किसी भी तरह से दिलचस्पी नहीं लेनी चाहिए।
म्लादेन बी।

जवाबों:


1665

सांकेतिक शब्दों में बदलना

public static string Base64Encode(string plainText) {
  var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
  return System.Convert.ToBase64String(plainTextBytes);
}

व्याख्या करना

public static string Base64Decode(string base64EncodedData) {
  var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
  return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

41
दोनों कार्यों में इनपुट स्ट्रिंग्स के लिए अशक्त जांच और समाधान एकदम सही है :)
सेवर्रि सिगमंडर्सन

22
@SverrirSigmundarson: यह है या उन्हें विस्तार के तरीके बनाते हैं।
टीजे क्राउडर

73
@SverrirSigmundarson - एक अशक्त जाँच क्यों होती है? वह इनपुट स्ट्रिंग को डीरफेर करने वाला नहीं है। अशक्त चेक को NullReferenceExceptionआपके स्वयं के कोड में रोकना चाहिए , न कि किसी और के।
केन

16
@ टोकन और कोई और कहेगा "आपको केवल अपने कोड में त्रुटियों को उजागर करना चाहिए, किसी और को नहीं", कम से कम आश्चर्य के सिद्धांत को लागू करते हुए, "असफल जल्दी" और "उचित एनकैप्सुलेशन" के साथ मसालेदार। कभी-कभी इसका मतलब निचले स्तर के घटकों की त्रुटियों को लपेटना होता है, कभी-कभी पूरी तरह से कुछ और। इस मामले में, मैं इस बात से सहमत हूँ कि एक डेरेफ़ त्रुटि लपेटना निश्चित रूप से संदिग्ध है (साथ ही हम सभी धीरे-धीरे इस तथ्य से सहमत हैं कि एक अवधारणा के रूप में अशक्त होना शुरू होने के लिए हैक का एक सा है), लेकिन हम अभी भी कुछ प्रभाव देख सकते हैं अन्यथा: यदि अनियंत्रित छोड़ दिया जाए तो अपवाद में दिया गया पैरामीटर नाम सही नहीं हो सकता है।
tne

6
वापसी System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); विंडोज़ फोन 8 के लिए
स्टीव ज़ोल्को

46

मैं कुछ साफ सुविधाओं के साथ अपने कार्यान्वयन को साझा कर रहा हूं:

  • एन्कोडिंग वर्ग के लिए विस्तार विधियों का उपयोग करता है। तर्क यह है कि किसी को विभिन्न प्रकार के एन्कोडिंग (न केवल UTF8) का समर्थन करने की आवश्यकता हो सकती है।
  • एक और सुधार अशक्त रूप से अशक्त परिणाम के लिए अशक्त परिणाम के साथ असफल हो रहा है - यह वास्तविक जीवन परिदृश्यों में बहुत उपयोगी है और एक्स = डीकोड (एनकोड (एक्स)) के लिए तुल्यता का समर्थन करता है।

टिप्पणी: कि उपयोग करने के लिए विस्तार विधि आप याद करने के लिए है (!) के साथ नाम स्थान आयात usingकीवर्ड (इस मामले में using MyApplication.Helpers.Encoding)।

कोड:

namespace MyApplication.Helpers.Encoding
{
    public static class EncodingForBase64
    {
        public static string EncodeBase64(this System.Text.Encoding encoding, string text)
        {
            if (text == null)
            {
                return null;
            }

            byte[] textAsBytes = encoding.GetBytes(text);
            return System.Convert.ToBase64String(textAsBytes);
        }

        public static string DecodeBase64(this System.Text.Encoding encoding, string encodedText)
        {
            if (encodedText == null)
            {
                return null;
            }

            byte[] textAsBytes = System.Convert.FromBase64String(encodedText);
            return encoding.GetString(textAsBytes);
        }
    }
}

उपयोग उदाहरण:

using MyApplication.Helpers.Encoding; // !!!

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Test2();
        }

        static void Test1()
        {
            string textEncoded = System.Text.Encoding.UTF8.EncodeBase64("test1...");
            System.Diagnostics.Debug.Assert(textEncoded == "dGVzdDEuLi4=");

            string textDecoded = System.Text.Encoding.UTF8.DecodeBase64(textEncoded);
            System.Diagnostics.Debug.Assert(textDecoded == "test1...");
        }

        static void Test2()
        {
            string textEncoded = System.Text.Encoding.UTF8.EncodeBase64(null);
            System.Diagnostics.Debug.Assert(textEncoded == null);

            string textDecoded = System.Text.Encoding.UTF8.DecodeBase64(textEncoded);
            System.Diagnostics.Debug.Assert(textDecoded == null);
        }
    }
}

5
के nullमामले में लौटना nullएक बहुत ही असंगत व्यवहार है। स्ट्रिंग्स के साथ काम करने वाला कोई अन्य .net एपीआई ऐसा नहीं करता है।
t3chb0t

4
@ t3chb0t अपनी आवश्यकताओं के अनुसार इसे समायोजित करने के लिए स्वतंत्र महसूस करता है। जिस तरह से यहां प्रस्तुत किया गया है वह हमारे लिए समायोजित किया गया था। यह एक सार्वजनिक एपीआई नहीं है;)
andrew.fox

1
क्या अब आपको अपने संचार में दूसरे पक्ष को 2 चर भेजने की ज़रूरत नहीं है (जिसे आप आधार 64 एन्कोडेड डेटा भेज रहे हैं)? आपको उपयोग किए गए एन्कोडिंग और वास्तविक बेस 64 डेटा दोनों को भेजने की आवश्यकता है? यदि आप एक ही एन्कोडिंग का उपयोग करने के लिए दोनों तरफ के सम्मेलन का उपयोग करते हैं तो क्या यह आसान नहीं है? इस तरह आपको केवल आधार 64 डेटा भेजना होगा, है ना?
म्लादेन बी।

38

एंड्रयू फॉक्स और सीबे के जवाबों के आधार पर, मैंने इसे बदल दिया और बेस 64 स्ट्रींग एक्सटेंशन के बजाय उन्हें स्ट्रिंग एक्सटेंशन बना दिया।

public static class StringExtensions
{
    public static string ToBase64(this string text)
    {
        return ToBase64(text, Encoding.UTF8);
    }

    public static string ToBase64(this string text, Encoding encoding)
    {
        if (string.IsNullOrEmpty(text))
        {
            return text;
        }

        byte[] textAsBytes = encoding.GetBytes(text);
        return Convert.ToBase64String(textAsBytes);
    }

    public static bool TryParseBase64(this string text, out string decodedText)
    {
        return TryParseBase64(text, Encoding.UTF8, out decodedText);
    }

    public static bool TryParseBase64(this string text, Encoding encoding, out string decodedText)
    {
        if (string.IsNullOrEmpty(text))
        {
            decodedText = text;
            return false;
        }

        try
        {
            byte[] textAsBytes = Convert.FromBase64String(text);
            decodedText = encoding.GetString(textAsBytes);
            return true;
        }
        catch (Exception)
        {
            decodedText = null;
            return false;
        }
    }
}

1
मैं एक ParseBase64 (यह स्ट्रिंग पाठ, एन्कोडिंग एन्कोडिंग, स्ट्रिंग डिकोडिटटेक्स्ट) जोड़ूंगा (यदि आवश्यक हो तो अपवाद को पॉप्युलेट करने के लिए, और कोशिश करें कि TryParseBase64 पर कॉल करें
João Antunes

22

Andrew.fox उत्तर पर थोड़ा बदलाव, स्ट्रिंग को डिकोड करने के लिए एक सही आधार 64 एनकोडेड स्ट्रिंग नहीं हो सकता है:

using System;

namespace Service.Support
{
    public static class Base64
    {
        public static string ToBase64(this System.Text.Encoding encoding, string text)
        {
            if (text == null)
            {
                return null;
            }

            byte[] textAsBytes = encoding.GetBytes(text);
            return Convert.ToBase64String(textAsBytes);
        }

        public static bool TryParseBase64(this System.Text.Encoding encoding, string encodedText, out string decodedText)
        {
            if (encodedText == null)
            {
                decodedText = null;
                return false;
            }

            try
            {
                byte[] textAsBytes = Convert.FromBase64String(encodedText);
                decodedText = encoding.GetString(textAsBytes);
                return true;
            }
            catch (Exception)
            {
                decodedText = null;
                return false;   
            }
        }
    }
}

13

स्ट्रिंग को बेस 64 प्रारूप में बदलने के लिए आप रूटीन के नीचे का उपयोग कर सकते हैं

public static string ToBase64(string s)
{
    byte[] buffer = System.Text.Encoding.Unicode.GetBytes(s);
    return System.Convert.ToBase64String(buffer);
}

इसके अलावा, आप बहुत अच्छे ऑनलाइन टूल OnlineUtility.in का उपयोग बेस 64 प्रारूप में स्ट्रिंग को एनकोड करने के लिए कर सकते हैं


ऑनलाइन उपकरण इस स्थिति में मदद नहीं करते हैं - वह पूछ रहा है कि इसे कैसे कोडित किया जाए। मुझे अक्सर आश्चर्य होता है कि लोग क्यों कहते हैं "इस ऑनलाइन टूल को देखें!", क्योंकि ओपी ने ऑनलाइन टूल के लिए नहीं पूछा: D
मोमोरो

9
    using System;
    using System.Text;

    public static class Base64Conversions
    {
        public static string EncodeBase64(this string text, Encoding encoding = null)
        { 
            if (text == null) return null;

            encoding = encoding ?? Encoding.UTF8;
            var bytes = encoding.GetBytes(text);
            return Convert.ToBase64String(bytes);
        }

        public static string DecodeBase64(this string encodedText, Encoding encoding = null)
        {
            if (encodedText == null) return null;

            encoding = encoding ?? Encoding.UTF8;
            var bytes = Convert.FromBase64String(encodedText);
            return encoding.GetString(bytes);
        }
    }

प्रयोग

    var text = "Sample Text";
    var base64 = text.EncodeBase64();
    base64 = text.EncodeBase64(Encoding.UTF8); //or with Encoding

4

URL सुरक्षित Base64 एनकोडिंग / डिकोडिंग

public static class Base64Url
{
    public static string Encode(string text)
    {
        return Convert.ToBase64String(Encoding.UTF8.GetBytes(text)).TrimEnd('=').Replace('+', '-')
            .Replace('/', '_');
    }

    public static string Decode(string text)
    {
        text = text.Replace('_', '/').Replace('-', '+');
        switch (text.Length % 4)
        {
            case 2:
                text += "==";
                break;
            case 3:
                text += "=";
                break;
        }
        return Encoding.UTF8.GetString(Convert.FromBase64String(text));
    }
}

1
प्रश्न URL एनकोडिंग के बारे में नहीं था, लेकिन फिर भी मददगार था ..
मोमोरो


कोई बात नहीं, यह देखना अभी भी दिलचस्प है कि URL को कैसे एनकोड / डिकोड किया जा सकता है :)
Momoro

3

आप इसे इस तरह प्रदर्शित कर सकते हैं:

var strOriginal = richTextBox1.Text;

byte[] byt = System.Text.Encoding.ASCII.GetBytes(strOriginal);

// convert the byte array to a Base64 string
string strModified = Convert.ToBase64String(byt);

richTextBox1.Text = "" + strModified;

अब, इसे वापस परिवर्तित करना।

var base64EncodedBytes = System.Convert.FromBase64String(richTextBox1.Text);

richTextBox1.Text = "" + System.Text.Encoding.ASCII.GetString(base64EncodedBytes);
MessageBox.Show("Done Converting! (ASCII from base64)");

आशा है कि ये आपकी मदद करेगा!


1

उन लोगों के लिए जो केवल व्यक्तिगत आधार 64 अंकों को एनकोड / डिकोड करना चाहते हैं:

public static int DecodeBase64Digit(char digit, string digit62 = "+-.~", string digit63 = "/_,")
{
    if (digit >= 'A' && digit <= 'Z') return digit - 'A';
    if (digit >= 'a' && digit <= 'z') return digit + (26 - 'a');
    if (digit >= '0' && digit <= '9') return digit + (52 - '0');
    if (digit62.IndexOf(digit) > -1)  return 62;
    if (digit63.IndexOf(digit) > -1)  return 63;
    return -1;
}

public static char EncodeBase64Digit(int digit, char digit62 = '+', char digit63 = '/')
{
    digit &= 63;
    if (digit < 52)
        return (char)(digit < 26 ? digit + 'A' : digit + ('a' - 26));
    else if (digit < 62)
        return (char)(digit + ('0' - 52));
    else
        return digit == 62 ? digit62 : digit63;
}

कर रहे हैं विभिन्न संस्करणों है कि क्या अंक 62 और 63 के लिए उपयोग करने के लिए के बारे में सहमत Base64 की है, तो DecodeBase64Digitइनमें से कई बर्दाश्त कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.