【问题标题】:How do I encode and decode a base64 string?如何编码和解码 base64 字符串?
【发布时间】:2021-10-27 22:33:30
【问题描述】:
  1. 给定字符串,如何返回 base64 编码的字符串?

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

【问题讨论】:

  • 如果这是一个“分享知识”的问题和答案,我想我们正在寻找更深入的东西。还可以快速搜索 SO:stackoverflow.com/a/7368168/419
  • 问问自己你真的需要这样做吗?请记住,base64 主要用于以 ASCII 表示二进制数据,用于存储在数据库中的 char 字段中或通过电子邮件发送(可以注入新行)。您是否真的要获取字符数据,将其转换为字节,然后将其转换回字符数据,这一次无法读取并且没有提示原始编码是什么?
  • 我们为什么要关心原始编码?我们使用 UTF8 表示将字符串编码为字节,它可以表示所有可能的字符串字符。然后我们序列化该数据,并在另一端反序列化该数据并重建我们最初拥有的相同字符串(字符串对象不包含有关使用的编码的信息)。那么,为什么对所使用的编码有任何担忧呢?我们可以将其视为表示序列化数据的专有方式,无论如何我们都不应该对此感兴趣。

标签: c# base64


【解决方案1】:

编码

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

【讨论】:

  • Null 检查两个函数中的输入字符串,解决方案很完美:)
  • @SverrirSigmundarson:或者让它们成为扩展方法。
  • @SverrirSigmundarson - 为什么要进行空检查?他不是取消引用输入字符串的人。空值检查应该防止 NullReferenceException 在您自己的代码中,而不是在其他人的代码中。
  • @ken 其他人会说“您应该只在自己的代码中暴露错误,而不是其他人的代码”,这引用了最小意外原则,并带有“早期失败”和“适当的封装”。有时这意味着包装低级组件的错误,有时则完全是别的东西。在这种情况下,我同意包装 deref 错误绝对是可疑的(而且我们都慢慢同意 null 作为一个概念开始有点破解的事实),但我们仍然可以看到一些效果否则:如果未选中,异常中给出的参数名称可能不正确。
  • return System.Text.Encoding.UTF8.GetString(base64EncodedBytes, 0, base64EncodedBytes.Length);适用于 windows 手机 8
【解决方案2】:

一个班轮代码:

注意:使用 SystemSystem.Text 指令。

编码:

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

解码:

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

【讨论】:

  • 感谢您记得提及命名空间 - 人们总是假设
  • @stimms 任何严肃的 IDE 都会为您提供这些;)
  • @derHugo 如果命名空间位于默认情况下未引用的程序集中,那么即使是严肃的 IDE 也无济于事:)
  • @RAPTOR 在这种情况下也很好,添加 using 语句也无济于事;)
  • @derHugo 当然是这样,但是如果我们知道命名空间,我们就可以猜出程序集的名称。 (至少它帮助了我几次)
【解决方案3】:

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

  • 使用编码类的扩展方法。基本原理是有人可能需要支持不同类型的编码(不仅仅是 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);
        }
    }
}

【讨论】:

  • null 的情况下返回null 是一种非常不一致的行为。没有其他适用于字符串的 .net API 可以做到这一点。
  • @t3chb0t 随时根据您的需要进行调整。因为这里呈现的方式已根据我们的方式进行了调整。这不是公共 API ;)
【解决方案4】:

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

【讨论】:

  • 我会添加一个 ParseBase64(这个字符串文本,编码编码,输出字符串解码文本)(如果需要填充异常,并在 TryParseBase64 上调用它
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

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

    【讨论】:

    • 在线工具在这种情况下无济于事——他在问如何编写代码。我经常想知道为什么人们说“看看这个在线工具!”,因为 OP 没有要求在线工具:D
    【解决方案7】:

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

    【讨论】:

    • 请注意,连续多次使用Replace()TrimEnd() 将分配新的字符串,这些字符串将立即成为GC 的垃圾。相反,您可以使用具有指定容量的StringBuilder 来避免额外的堆分配。
    【解决方案8】:
        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】:

      你可以这样显示:

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

      我希望这会有所帮助!

      【讨论】:

        【解决方案10】:

        对于那些只想编码/解码单个 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 的 various versions 对数字 62 和 63 使用什么意见不一,因此 DecodeBase64Digit 可以容忍其中的几个。

        【讨论】:

          【解决方案11】:
          // Encoding
          string passw = "tes123";
          var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(passw);
          string pass = System.Convert.ToBase64String(plainTextBytes);
          
          // Normal
          var encodedTextBytes = Convert.FromBase64String(pass);
          string plainText = Encoding.UTF8.GetString(encodedTextBytes);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-31
            • 1970-01-01
            • 2019-07-30
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多