如何编码和解码base64字符串?

Kev*_*ger 809 c# base64

  1. 如何在给定字符串的情况下返回base64编码的字符串?

  2. 如何将base64编码的字符串解码为字符串?

Kev*_*ger 1535

编码

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

解码

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

  • @SverrirSigmundarson - 为什么要进行空检查?他不是解除引用输入字符串的人.空检查应该在您自己的代码中阻止`NullReferenceException`,而不是其他人的. (68认同)
  • Null检查两个函数中的输入字符串,解决方案是完美的:) (40认同)
  • @SverrirSigmundarson:那或者使它们成为扩展方法. (22认同)
  • @ken其他人会说"你应该只在你自己的代码中暴露错误,而不是别人的错误",引用最少惊喜的原则,加上"早期失败"和"适当的封装".有时这意味着包装较低级别组件的错误,有时完全是其他东西.在这种情况下,我会同意包装一个deref错误肯定是可疑的(加上我们都在慢慢地同意null作为一个概念是一个黑客开始的事实),但我们仍然可以看到一些效果否则:如果未选中,则异常中给出的参数名称可能不正确. (16认同)
  • return System.Text.Encoding.UTF8.GetString(base64EncodedBytes,0,base64EncodedBytes.Length); 对于Windows Phone 8 (6认同)
  • 替代建议:合同(`Contract.Requires(plainText!= null)`)和你的代码是完美的:) (2认同)
  • @Tatyana在javaScript中使用`atob()`(alpha-to-binary)进行编码,使用`btoa()`进行解码 (2认同)

Zei*_*ist 81

一个班轮代码:

注意:使用SystemSystem.Text指令。

编码:

string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes("inputStr"));
Run Code Online (Sandbox Code Playgroud)

解码:

string inputStr = Encoding.UTF8.GetString(Convert.FromBase64String(encodedStr));
Run Code Online (Sandbox Code Playgroud)

  • 感谢您记得提及命名空间 - 人们总是假设 (8认同)
  • @derHugo 当然是这样,但是如果我们知道名称空间,我们就可以猜测程序集名称。(至少它帮助了我好几次) (2认同)

and*_*fox 45

我正在用一些简洁的功能分享我的实现:

  • 使用扩展方法编码类.理由是有人可能需要支持不同类型的编码(不仅仅是UTF8).
  • 另一个改进是优雅地使用null结果进行null输入 - 它在现实生活场景中非常有用,并且支持X = decode(encode(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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果为null,则返回null是非常不一致的行为。没有其他适用于字符串的.net API可以做到这一点。 (4认同)
  • @ t3chb0t随时可以根据您的需要进行调整.正如它在这里呈现的方式被调整为我们的.这不是公共API;) (3认同)

j2a*_*tes 33

基于Andrew Fox和Cebe的答案,我转过身来,使它们成为字符串扩展而不是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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我会添加一个 ParseBase64(this string text, Encoding编码, out string generatedText) (如果需要的话填充异常,并在 TryParseBase64 上调用它 (2认同)

小智 20

对andrew.fox答案略有不同,因为要解码的字符串可能不是正确的base64编码字符串:

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;   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


jul*_*uck 11

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));
    }
}
Run Code Online (Sandbox Code Playgroud)


Sam*_* R. 6

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法

    var text = "Sample Text";
    var base64 = text.EncodeBase64();
    base64 = text.EncodeBase64(Encoding.UTF8); //or with Encoding
Run Code Online (Sandbox Code Playgroud)


Qwe*_*tie 5

对于那些只想对各个 Base64 数字进行编码/解码的人:

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;
}
Run Code Online (Sandbox Code Playgroud)

Base64有多种版本,对于数字 62 和 63 使用什么内容存在分歧,因此DecodeBase64Digit可以容忍其中的几种。


小智 5

您可以使用以下例程将字符串转换为base64格式

public static string EncryptBase64(string StringToEncrypt)
        {
            byte[] buffer = (new UnicodeEncoding()).GetBytes(StringToEncrypt);
            return System.Convert.ToBase64String(buffer);
        }
Run Code Online (Sandbox Code Playgroud)

您也可以使用非常好的在线工具OnlineUtility.in以Base64格式编码字符串


Mom*_*oro 5

你可以这样显示:

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;
Run Code Online (Sandbox Code Playgroud)

现在,将其转换回来。

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

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

我希望这有帮助!