Base64 string එකක් කේතනය කර විකේතනය කරන්නේ කෙසේද?


933
  1. නූලක් ලබා දී ඇති base64 කේතනය කළ නූලක් ආපසු ලබා දෙන්නේ කෙසේද?

  2. Base64 කේතනය කරන ලද නූලක් නූලකට විකේතනය කරන්නේ කෙසේද?


4
මෙය "දැනුම බෙදා ගැනීම" ප්‍රශ්නයක් සහ පිළිතුරක් නම්, මම හිතන්නේ අපි තව ටිකක් ගැඹුරු යමක් සොයනවා. SO පිළිබඳ ඉක්මන් සෙවීමක් ද සිදු වේ: stackoverflow.com/a/7368168/419
Kev

1
NGnark ඕනෑම නූලක් කේතනය කර ඇත්තේ කිසියම් යටින් පවතින බිට්-කේතන ක්‍රමවේදය මගිනි. එය ASCII, UTF7, UTF8, වේවා .... මතු වන ප්‍රශ්නය අසම්පූර්ණයි.
ලොරෙන්ස් ලො සෝවර්

2
ඔබ මෙය අසා ඇත්තටම කළ යුතුද? මතක තබා ගන්න base64 මූලික වශයෙන් ASCII හි ද්විමය දත්ත නිරූපණය කිරීම සඳහා, දත්ත සමුදායක වර්‍ග ක්ෂේත්‍රයක ගබඩා කිරීම හෝ විද්‍යුත් තැපෑලෙන් යැවීම (නව රේඛා එන්නත් කළ හැකි). ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය වන්නේ අක්‍ෂර දත්ත ගැනීමට, එය බයිට් බවට පරිවර්තනය කිරීමට, පසුව එය නැවත අක්ෂර දත්ත බවට පරිවර්තනය කිරීමට, මේ වතාවේ කියවිය නොහැකි සහ මුල් කේතන ක්‍රමය කුමක් දැයි ඉඟියක් නොමැතිව?
bbsimonbb

1
මුල් කේතන ක්‍රමය ගැන අප සැලකිලිමත් විය යුත්තේ ඇයි? UTF8 නිරූපණය භාවිතා කරමින් අපි නූල බයිට් වලට සංකේතවත් කරන්නෙමු. ඉන්පසු අපි එම දත්ත අනුක්‍රමිකකරණය කරන අතර අනෙක් අන්තයේ අපි එම දත්ත අභිමතකරණය කර අප මුලින් තිබූ නූලම ප්‍රතිනිර්මාණය කරමු (නූල් වස්තුව කෙසේ හෝ භාවිතා කරන කේතන ක්‍රම පිළිබඳ තොරතුරු රඳවා නොගනී). එසේනම් භාවිතා කරන කේතන ක්‍රමයට අදාළව සැලකිලිමත් වන්නේ ඇයි? අපට එය කෙසේ හෝ උනන්දු නොවිය යුතු අනුක්‍රමික දත්ත නිරූපණය කිරීමේ හිමිකාර ක්‍රමයක් ලෙස සැලකිය හැකිය.
මැලේඩන් බී.

Answers:


1742

එන්කෝඩ්

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

44
කාර්යයන් දෙකෙහිම ආදාන නූල් සඳහා ශුන්‍ය චෙක්පත් සහ විසඳුම පරිපූර්ණයි :)
Sverrir Sigmundarson

24
VerSverrirSigmundarson: එය හෝ ඒවා දිගු කිරීමේ ක්‍රම බවට පත් කරන්න.
ටී. ජේ. ක්‍රෝඩර්

75
VerSverrirSigmundarson - ශුන්‍ය පරීක්‍ෂණයක් කරන්නේ ඇයි? ඔහු ආදාන නූල නොසලකා හරින තැනැත්තා නොවේ. ශුන්‍ය චෙක්පත් NullReferenceExceptionඔබේ කේතයෙන් වළක්වා ගත යුතුය , වෙනත් කෙනෙකුගේ නොවේ.
කෙන්

16
@ken සහ තවත් අයෙක් "ඔබ හෙළි කළ යුත්තේ ඔබේම කේතයේ වැරදි මිස වෙනත් කෙනෙකුගේ නොවේ", අවම වශයෙන් පුදුම කිරීමේ මූලධර්මය ක්‍රියාත්මක කරමින්, "කලින් අසමත් වීම" සහ "නිසි සංවර්‍ධනය" සමඟ කුළුබඩු. සමහර විට මෙයින් අදහස් කරන්නේ පහළ මට්ටමේ සංරචකවල දෝෂ එතීම, සමහර විට සම්පූර්ණයෙන්ම වෙනත් දෙයක්. මෙම අවස්ථාවෙහිදී, ඩෙරෙෆ් දෝෂයක් ඔතා ගැනීම නිසැකවම සැක සහිත බව මම එකඟ වෙමි (ප්ලස් සංකල්පයක් ලෙස ශුන්‍ය වීම ආරම්භ කිරීම සඳහා සුළු කරදරයක් බව අපි සැවොම එකඟ වෙමු), නමුත් අපට තවමත් සමහර බලපෑම් දැකිය හැකිය වෙනත් ආකාරයකින්: ව්‍යතිරේකයේ දී ඇති පරාමිති නාමය පරීක්ෂා නොකර තබා ඇත්නම් නිවැරදි නොවනු ඇත.
tne

6
ආපසු System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); වින්ඩෝස් දුරකථන 8 සඳහා
ස්ටීවන් සොලෙකෝ

46

මම මගේ ක්‍රියාවට නැංවීමේ අංග කිහිපයක් සමඟ බෙදා ගන්නෙමි:

  • කේතීකරණ පන්තිය සඳහා දිගු කිරීමේ ක්‍රම භාවිතා කරයි. තාර්කිකත්වය නම් යමෙකුට විවිධ වර්ගයේ කේතන ක්‍රම සඳහා (UTF8 පමණක් නොව) සහාය වීමට අවශ්‍ය විය හැකිය.
  • තවත් වැඩිදියුණු කිරීමක් නම්, ශුන්‍ය ප්‍රවේශය සඳහා ශුන්‍ය ප්‍රති result ල සමඟ මනාව අසමත් වීමයි - එය සැබෑ ජීවිත අවස්ථා වලදී ඉතා ප්‍රයෝජනවත් වන අතර X = විකේතනය (එන්කෝඩ් (X)) සඳහා සමානතාවයට සහාය වේ.

සටහන: දිගු කිරීමේ ක්‍රමය භාවිතා කිරීමට නම් (!) නාමපදය 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 API එය නොකරයි.
t3chb0t

4
needs t3chb0t ඔබගේ අවශ්‍යතාවයන්ට අනුව එය සකස් කිරීමට නිදහස් වන්න. මෙහි ඉදිරිපත් කර ඇති ආකාරය අපට ගැලපෙන පරිදි සකස් කර ඇත. මෙය පොදු API නොවේ;)
andrew.fox

1
ඔබේ සන්නිවේදනයේ අනෙක් පාර්ශවයට (ඔබ පදනම් 64 කේතනය කළ දත්ත යවන්නේ කාටද) දැන් ඔබට විචල්‍ය 2 ක් යැවිය යුතු නොවේද? ඔබ භාවිතා කළ කේතන ක්‍රමය සහ සත්‍ය පදනම් 64 දත්ත යන දෙකම යැවිය යුතුද? එකම කේතන ක්‍රමයක් භාවිතා කිරීම සඳහා ඔබ දෙපස සම්මුතියක් භාවිතා කරන්නේ නම් එය පහසු නොවේද? ඒ ආකාරයෙන් ඔබට යැවිය යුත්තේ base64 දත්ත පමණි, නේද?
මැලේඩන් බී.

38

ඇන්ඩ rew ෆොක්ස් සහ සෙබේගේ පිළිතුරු මත පදනම්ව, මම එය හරවා Base64String දිගු වෙනුවට නූල් දිගු කළෙමි.

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 (මෙම වචන පෙළ, එන්කෝඩින් එන්කෝඩින්, ස්ට්‍රිං ඩෙකෝඩ් ටෙක්ස්ට්) එකතු කරමි (අවශ්‍ය නම් ව්‍යතිරේකය ජනගහනය කිරීම සඳහා, එය ට්‍රයිපාර්ස්බේස් 64
ජොආන්

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

14

නූල් පදනම් 64 ආකෘතියට පරිවර්තනය කිරීම සඳහා ඔබට පහත පුරුද්ද භාවිතා කළ හැකිය

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

Base64 ආකෘතියෙන් නූල් කේතනය කිරීම සඳහා ඔබට ඉතා හොඳ මාර්ගගත මෙවලමක් වන OnlineUtility.in භාවිතා කළ හැකිය


1
මෙම තත්වයට සබැඳි මෙවලම් උදව් නොකරයි - ඔහු එය කේත කරන්නේ කෙසේදැයි අසයි. OP බොහෝ විට අන්තර්ජාල මෙවලමක් ඉල්ලා නොසිටි නිසා මිනිසුන් "මෙම මාර්ගගත මෙවලම බලන්න" යැයි පවසන්නේ මන්දැයි මම බොහෝ විට කල්පනා කරමි: D
Momoro

10

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

ගැටළුවක් නැත, URL එකක් කේතනය කරන්නේ / විකේතනය කරන්නේ කෙසේදැයි බැලීම තවමත් සිත්ගන්නා කරුණකි :)
මෝමෝරෝ

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

9

එක් ලයිනර් කේතයක්:

සටහන: භාවිතය Systemසහ System.Textනියෝග.

එන්කෝඩ්:

string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes("inputStr"));

විකේතනය:

string inputStr = Encoding.UTF8.GetString(Convert.FromBase64String(encodedStr));

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මේ කිහිපයක් දරාගත හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.