ChatGPT解决这个技术问题 Extra ChatGPT

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

如何在给定字符串的情况下返回 base64 编码的字符串?如何将 base64 编码的字符串解码为字符串?

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

A
Azeem

编码

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 作为一个概念开始有点破解的事实),但我们仍然可以看到一些效果否则:如果未选中,异常中给出的参数名称可能不正确。
返回 System.Text.Encoding.UTF8.GetString(base64EncodedBytes, 0, base64EncodedBytes.Length);适用于 Windows 电话 8
Z
Zeigeist

一个班轮代码:

注意:使用 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 当然是这样,但是如果我们知道命名空间,我们就可以猜出程序集的名称。 (至少它帮助了我几次)
a
andrew.fox

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

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

根据 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 上调用它
C
Cebe

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

D
Daniel

您可以使用以下例程将字符串转换为 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
j
julius-huck

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 来避免额外的堆分配。
S
Sameera R.
    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

J
Josef
// 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);

Q
Qwertie

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

various versions 个 Base64 对数字 62 和 63 使用什么意见不一,因此 DecodeBase64Digit 可以容忍其中的几个。


M
Momoro

您可以像这样显示它:

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

我希望这有帮助!