আমি কীভাবে একটি বেস 64 স্ট্রিংটিকে এনকোড এবং ডিকোড করব?


885
  1. আমি একটি স্ট্রিংয়ের সাহায্যে বেস 64 এনকোডেড স্ট্রিংটি কীভাবে ফিরিয়ে দেব?

  2. আমি একটি বেস 64 এনকোডেড স্ট্রিংটিকে স্ট্রিংয়ে কীভাবে ডিকোড করব?


4
যদি এটি "জ্ঞান ভাগ করে নেওয়ার" প্রশ্ন এবং উত্তর হয় তবে আমি মনে করি আমরা আরও কিছু গভীরতার সাথে কিছু খুঁজছি। এছাড়াও এসওর
কেভ

1
@ জার্নাক যে কোনও স্ট্রিং নির্দিষ্ট বিট-এনকোডিং স্কিমা দ্বারা এনকোড করা হয়েছে। এটি ASCII, UTF7, UTF8, .... হয়ে উঠুক প্রশ্নটি সেরা অসম্পূর্ণ।
লরেঞ্জ লো Sauer

2
নিজেকে জিজ্ঞাসা করুন আপনার এই কাজটি করা দরকার? মনে রাখবেন বেস 64 মূলত ASCII তে বাইনারি ডেটা উপস্থাপনের জন্য, একটি ডাটাবেসে চর ক্ষেত্রের মধ্যে সঞ্চয় করার জন্য বা ইমেলের মাধ্যমে প্রেরণের জন্য (যেখানে নতুন লাইনগুলি ইনজেকশন দেওয়া যেতে পারে) উদ্দেশ্যে তৈরি is আপনি কি সত্যিই চরিত্রের ডেটা নিতে চান, এটিকে বাইটে রূপান্তর করতে চান, আবার এটিকে অক্ষর ডেটাতে রূপান্তর করতে চান, এবার অপঠনযোগ্য এবং মূল এনকোডিং কী ছিল তার কোনও ইঙ্গিত ছাড়াই?
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
উভয় ফাংশনে ইনপুট স্ট্রিংগুলির জন্য নাল চেক করে এবং সমাধানটি নিখুঁত :)
Sverrir Sigmundarson

22
@ সার্ভারির সিগমুন্ডারসন: এটি বা তাদের সম্প্রসারণের পদ্ধতিগুলি তৈরি করুন।
টিজে ক্রাউডার

73
@ সার্ভারির সিগমুন্দরসন - কেন নাল চেক করবেন? তিনি যে ইনপুট স্ট্রিংকে ডিফেরেন্স করছেন তা নয়। নাল চেকগুলি NullReferenceExceptionআপনার নিজের কোডে প্রতিরোধ করা উচিত , অন্য কারওর নয়।
কেন

16
@ এবং অন্য কেউ বলবেন, "আপনার নিজের কোডে কেবল ত্রুটি প্রকাশ করা উচিত, অন্য কারও নয়", "ব্যর্থ তাড়াতাড়ি" এবং "যথাযথ এনক্যাপসুলেশন" দিয়ে মশলাদার, অন্তত বিস্ময়ের নীতিটি প্রেরণ করে। কখনও কখনও এর অর্থ নিম্ন-স্তরের উপাদানগুলির মোড়ানো ত্রুটি, কখনও কখনও পুরোপুরি অন্য কিছু। এই ক্ষেত্রে, আমি একমত যে একটি ডেরেফ ত্রুটি মোড়ানো অবশ্যই সন্দেহজনক (প্লাস আমরা সকলেই আস্তে আস্তে একমত হয়ে যাচ্ছি যে একটি ধারণা হিসাবে নাল একটি হ্যাক হ'ল) ​​তবে আমরা এখনও কিছু প্রভাব দেখতে পারি অন্যথায়: ব্যতিক্রমটিতে প্রদত্ত প্যারামিটারের নামটি যদি চেক না করা থাকে তবে সঠিক নাও হতে পারে।
tne

6
System.Text.Encoding.UTF8.GetString (বেস 64 এনকোডেড বাইটস, 0, বেস64 এনকোডবিটস.লেন্থ); উইন্ডোজ ফোন 8 এর জন্য
স্টিভেন জোলেকো

46

আমি কিছু পরিষ্কার-পরিচ্ছন্নতার সাথে আমার বাস্তবায়নটি ভাগ করছি:

  • এনকোডিং শ্রেণীর জন্য এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে। যুক্তি হ'ল কাউকে বিভিন্ন ধরণের এনকোডিংগুলি সমর্থন করার প্রয়োজন হতে পারে (কেবলমাত্র ইউটিএফ 8 নয়)।
  • নাল প্রবেশের জন্য নাল ফলাফলের সাথে আরেকটি উন্নতি কৃত্রিমভাবে ব্যর্থ হচ্ছে - এটি বাস্তব জীবনের পরিস্থিতিতে খুব কার্যকর এবং এক্স = ডিকোড (এনকোড (এক্স)) এর জন্য সমতা সমর্থন করে।

মন্তব্য: ব্যবহার করা এক্সটেনশন পদ্ধতি আপনি মনে রাখবেন আছে (!) সঙ্গে নামস্থান আমদানি 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একটি খুব বেমানান আচরণ। স্ট্রিংগুলির সাথে কাজ করে এমন অন্য কোনও। নেট এপিআই তা করে না।
t3chb0t

4
@ t3chb0t এটিকে আপনার প্রয়োজনের সাথে সামঞ্জস্য করতে নির্দ্বিধায় মনে হয়। যেভাবে এটি এখানে উপস্থাপন করা হয়েছে তা আমাদের সাথে সামঞ্জস্য করা হয়েছিল। এটি কোনও সর্বজনীন এপিআই নয়;)
অ্যান্ড্রু.ফক্স

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 (এই স্ট্রিং টেক্সট, এনকোডিং এনকোডিং, আউট স্ট্রিং decodedText) যোগ হবে (ব্যতিক্রম পূরণ করতে প্রয়োজনে, এবং কল যে TryParseBase64 উপর
জোয়াও Antunes

22

অ্যান্ড্রু.ফক্স উত্তরের একটি সামান্য প্রকরণ, ডিকোড করার স্ট্রিংটি সঠিক বেস 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);
}

এছাড়াও আপনি বেস 64 ফর্ম্যাটে স্ট্রিং এনকোড করতে খুব ভাল অনলাইন সরঞ্জাম অনলাইন ইউটিলিটি.ইন ব্যবহার করতে পারেন


অনলাইন সরঞ্জামগুলি এই পরিস্থিতিতে সহায়তা করে না - তিনি কীভাবে এটি আইডি কোড করবেন তা জিজ্ঞাসা করছেন। আমি প্রায়শই অবাক হই কেন লোকেরা "এই অনলাইন সরঞ্জামটি পরীক্ষা করে দেখুন!", কারণ ওপি কোনও অনলাইন সরঞ্জামের জন্য জিজ্ঞাসা করেনি: ডি
মোমোরো

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

ইউআরএল নিরাপদ বেস 64 এনকোডিং / ডিকোডিং

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
প্রশ্নটি ইউআরএল এনকোডিং সম্পর্কে নয়, তবে এখনও সহায়ক ..
মোমোরো

ওহো, এটি ভুল প্রশ্নের অধীনে পোস্ট করেছেন
জুলিউশাক

কোনও সমস্যা নেই,
ইউআরএলকে

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;
}

বেস 64 এর বিভিন্ন সংস্করণ রয়েছে যা 62 এবং 63 সংখ্যার জন্য কী ব্যবহার করবেন তা নিয়ে দ্বিমত রয়েছে, তাই এর DecodeBase64Digitবেশ কয়েকটি সহ্য করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.