C# 什么会导致Base64解码引发FormatException

C# 什么会导致Base64解码引发FormatException,c#,.net,base64,C#,.net,Base64,我正在使用C#和.NET对base64字符串进行编码和解码。以下是我的代码片段: Base64编码: using (var stream = new MemoryStream()) …... return Convert.ToBase64String(stream.ToArray()); } Base64解码 byte[] bytes = Convert.FromBase64String(messageBody); 我的代码99%的时间失败,但成功的几率为1%。堆栈跟

我正在使用C#和.NET对base64字符串进行编码和解码。以下是我的代码片段:

Base64编码:

using (var stream = new MemoryStream())
        …...
    return Convert.ToBase64String(stream.ToArray());
}
Base64解码

byte[] bytes = Convert.FromBase64String(messageBody);
我的代码99%的时间失败,但成功的几率为1%。堆栈跟踪如下所示:

    private static string Decode(string htmlEncoded)
    {
        try
        {
            string regularEncodedString = WebUtility.UrlDecode(htmlEncoded);
            byte[] decoded = Convert.FromBase64String(regularEncodedString);

            return Encoding.ASCII.GetString(decoded);
        }
        catch(Exception)
        {
            return "Decoding failed";
        }
    }
返回5xx错误:System.FormatException:输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上填充字符或填充字符中的非法字符。在System.Convert.FromBase64_ComputersSultLength(Char inputPtr,Int32 inputLength)在System.Convert.FromBase64CharPtr(Char*inputPtr,Int32 inputLength)处在System.Convert.FromBase64String处(字符串s)*


有人知道什么会导致base64解码失败吗?我的编码和解码方法是对称的,我真的很困惑这个问题的根本原因是什么?

为了调试这样的问题,我通常编写一些测试或创建一个控制台应用程序来观察变量在函数之间的变化

base64解码失败的一种可能情况是解码器输入是HTMLEncoded。例如,当您将加密字符串传递到URL时,这是很常见的。它将自动进行HTML编码,然后根据编码输出的字符,有时可以解码,有时不能解码

这里有一个简单的控制台应用程序来演示这一点

class Program
{
    static void Main(string[] args)
    {
        string input = "testaa";

        TestEncodeDecode("test");
        TestEncodeDecode("testa");
        TestEncodeDecode("testaa");

        Console.ReadLine();
    }

    private static void TestEncodeDecode(string input)
    {
        string encoded = Encode(input);

        Console.WriteLine($"Encoded: {encoded}");

        string htmlEncoded = WebUtility.UrlEncode(encoded);

        Console.WriteLine($"htmlEncoded: {htmlEncoded}");

        string decodedString = Decode(htmlEncoded);

        Console.WriteLine($"Decoded: {decodedString}");

        Console.WriteLine();
    }

    private static string Decode(string htmlEncoded)
    {
        try
        {
            byte[] decoded = Convert.FromBase64String(htmlEncoded);

            return Encoding.ASCII.GetString(decoded);
        }
        catch(Exception)
        {
            return "Decoding failed";
        }
    }

    private static string Encode(string input)
    {
        byte[] bytes = Encoding.ASCII.GetBytes(input);
        using (var stream = new MemoryStream())
        {
            stream.Write(bytes);
            return Convert.ToBase64String(stream.ToArray());
        }
    }
}
您将看到前两个参数(“test”和“testa”)无法解码,但第三个参数(“testa”)将成功解码

要“修复”此问题,请按如下方式更改解码方法:

    private static string Decode(string htmlEncoded)
    {
        try
        {
            string regularEncodedString = WebUtility.UrlDecode(htmlEncoded);
            byte[] decoded = Convert.FromBase64String(regularEncodedString);

            return Encoding.ASCII.GetString(decoded);
        }
        catch(Exception)
        {
            return "Decoding failed";
        }
    }

谢谢你的回复


原来仍然有一些Json格式的旧消息,以前无法传递,并在我们的系统中不断重试;然而,我们接收端的新代码更改被部署,并且我们的接收端开始期望protobuf格式的消息,这导致在接收旧Json格式的消息时反序列化失败

您如何接收
messageBody
变量?它是否包含文字换行符或其他非base64字符?您需要传递base64字符串,并且只传递base64字符串;我们将编码的base64字符串发送到队列并接收它,然后通过base64解码使用它。让我重新表述一下,请包括加载
messageBody
变量的代码和失败的
messageBody
文本的示例。显然,它包含无效字符并导致错误。所以问题在于你的数据传输或读取。如果你能提供一个。您必须向我们显示
messageBody
的确切值。当它失败时。如果你不知道的话,我建议你在失败时登录。另外,如果存在隐藏的空白字符,请确保记录
messageBody
Length
什么会导致Base64解码引发FormatException
如果您要求它解码的字符串不是有效的Base64编码字符串,则可能会发生这种情况。实际上,bas假设解码后的Base64是ASCII,甚至是ASCII任何可打印的字符串。Base64通常用于将二进制编码为可打印的字符串表示。“Base64是一组类似于文本的二进制编码方案,通过将二进制数据转换为基数64表示,以ASCII字符串格式表示二进制数据。”我试图解释如何解决类似问题,并给出了一个工作示例。如何改进我的答案?最简单的方法是显示Base64编码的数据,并对其进行目视检查,可能还可以使用以下站点对其进行试解码。不需要编码。示例用法代码很好,但
Encoding.ASCII.GetString(已解码)
是一个可怕的例子,因为它不能处理Base64编码的非ASCII数据,这是Base64的常用用法。