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


885
  1. 给定字符串,如何返回以base64编码的字符串?

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


4
如果这是一个“共享知识”的问题和答案,我认为我们正在寻找更深入的东西。还可以快速搜索SO:stackoverflow.com/a/7368168/419
Kev 2012年

1
@Gnark任何字符串均由某些基础位编码架构编码。可能是ASCII,UTF7,UTF8,...。提出的问题充其量是不完整的。
洛伦兹·洛绍尔

2
问问自己,您真的需要这样做吗?请记住,base64主要用于表示ASCII二进制数据,用于存储在数据库的char字段中或通过电子邮件发送(可以插入新行)。您是否真的要获取字符数据,将其转换为字节,然后将其转换回字符数据,这一次不可读,也没有暗示原始编码是什么?
bbsimonbb '16

我们为什么要关心原始编码?我们使用UTF8表示形式将字符串编码为字节,该表示形式可以表示所有可能的字符串字符。然后,我们对该数据进行序列化,在另一方面,我们对该数据进行反序列化,并重建最初具有的相同字符串(字符串对象无论如何都不会保留有关编码的信息)。那么,为什么与使用的编码有关呢?我们可以将其视为代表序列化数据的专有方式,无论如何我们都不应该对此感兴趣。
Mladen B.19年

Answers:


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 2014年

22
@SverrirSigmundarson:还是让它们成为扩展方法。
TJ Crowder 2014年

73
@SverrirSigmundarson-为什么要进行空检查?他不是取消引用输入字符串的人。空检查应该阻止NullReferenceException您自己的代码,而不是别人的代码。

16
@ken还有其他人会说:“您应该只暴露自己的代码中的错误,而不是其他人的错误”,并采用“最少失败”和“早期失败”和“正确封装”的原则。有时,这意味着包装低级组件的错误,有时完全是其他错误。在这种情况下,我会同意包装一个deref错误绝对是可疑的(此外,我们都慢慢同意一个事实,即null作为一个概念开始有点麻烦),但我们仍然可以看到一些效果否则:如果不选中,则异常中给定的参数名称可能不正确。
tne

6
返回System.Text.Encoding.UTF8.GetString(base64EncodedBytes,0,base64EncodedBytes.Length); 对于Windows Phone 8
Steveen zoleko,2015年

46

我将通过一些简洁的功能分享我的实现:

  • 使用扩展方法编码类。理由是有人可能需要支持不同类型的编码(不仅限于UTF8)。
  • 另一个改进是由于空输入而导致的空结果导致正常失败-在现实生活中这非常有用,并且支持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);
        }
    }
}

用法示例:

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
@ t3chb0t可以根据需要进行调整。由于此处显示的方式已针对我们的情况进行了调整。这不是公共API;)
andrew.fox

1
您现在是否不必将2个变量发送给通信中的另一方(向谁发送base64编码的数据)?您需要同时发送使用的编码和实际的base64数据吗?如果您在两侧都使用约定使用相同的编码,会不会更容易?这样,您只需要发送base64数据,对吗?
Mladen B.

38

根据安德鲁·福克斯(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;
        }
    }
}

1
我想补充一个ParseBase64(这串文字,编码方式进行编码,串出decodedText)(来填充异常,如果需要,并调用在TryParseBase64
若昂·安图内斯

22

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

13

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

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

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


在线工具在这种情况下无济于事-他在问如何对其进行编码。我经常想知道为什么人们会说“

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编码的,而是有用的 ..
Momoro

糟糕,将其发布在错误的问题下
juliushuck

没问题,看看如何编码/解码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

对于那些只想对单个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;
}

Base64 有多种版本,它们对于数字62和63使用什么表示不同,因此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.