我有一个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);
}
}
答案 0 :(得分: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);
}