Convert.FromBase64String()抛出"无效的Base-64字符串"错误

时间:2018-05-25 08:21:23

标签: c# base64 decode encode

我有一个Base64编码的密钥。

尝试解码时,我收到以下错误。 byte[] todecode_byte = Convert.FromBase64String(data);

引发了错误
  

base64Decode中的错误输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符。

我使用以下方法对此进行解码:

public string base64Decode(string data)
{
    try
    {
        System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
        System.Text.Decoder utf8Decode = encoder.GetDecoder();

        byte[] todecode_byte = Convert.FromBase64String(data); // this line throws the exception

        int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
        char[] decoded_char = new char[charCount];
        utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
        string result = new String(decoded_char);
        return result;
    }
    catch (Exception e)
    {
        throw new Exception("Error in base64Decode" + e.Message);
    }
}

3 个答案:

答案 0 :(得分:3)

所以有两个问题:

  1. 你的字符串不是4长的倍数。它需要使用' ='填充到4的倍数。字符。
  2. 看起来像the format of base 64 used for URLs and suchlike, "modified Base64 for URL"。这使用-代替+_代替/
  3. 要解决此问题,您需要将-+_交换为/并填充它,如下所示:

    public static byte[] DecodeUrlBase64(string s)
    {
        s = s.Replace('-', '+').Replace('_', '/').PadRight(4*((s.Length+3)/4), '=');
        return Convert.FromBase64String(s);
    }
    

答案 1 :(得分:0)

您的base64-String无效。它包含-,不允许使用。

static void Main()
{
    string tmp = "eL78WIArGQ7bC44Ozr0yvUBkz9oc5YlsENYJilInSP==";
    byte[] tmp2 = Convert.FromBase64String(tmp);
}

- >删除减号 - >添加了两个填充字符“=

答案 2 :(得分:0)

我在使用 .Net 5 Identity Framework 时在 ASP.Net MVC 应用程序中发送密码重置令牌时遇到了同样的问题。在 URL 中重置密码令牌是一个有效的 URL 编码 Base64 字符串字符串,但在查询参数的绑定上,.Net Framework 通过将 + 符号转换为空格来产生问题。因此,在用 + 符号替换空格后,它运行良好。

我已根据@Mathew Watson 的已接受答案更新了 DecodeUrlBase64 方法以处理空格。

public static byte[] DecodeUrlBase64(string s)
{
     s = s.Replace(' ', '+').Replace('-', '+').Replace('_', '/').PadRight(4*((s.Length+3)/4),'=');
     return Convert.FromBase64String(s);
}