我从Android发送一个base 64字符串到用C#编写的.NET Web服务。我已经记录了这个字符串,它很快就完成了:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjFVH+fZ60DB7RZFiTePo9wJfkNu//TfODTJCiHv9cwwrxmiwVzHDXWhjzkgyUGBH08YO8bAMdzu4NALD3dlBux4QkSg2yvJmJjULCbaxSTE82aJDzjUOz7KoutTHFK0INFEiINWo7vdKSLiqiXpzfjCfV6DKRbM6DkKmEdFz1SOCWS+f8zs5gheke/ykI6JokzvD+Tw5n2AhHis7cuWJx8e/5BziPMLHbhsoYrpMzGl3SGqBKBoasxXiCgYfvS5RpI57oidGojvNbqsZBA30cbmX6IjXBs61O3zhgY25HKHp5yjHuMXNoNd4GY6Ya/l6yKPqNcKz1x37CP4NfkckbwIDAQAB
当我尝试像这样解码时:Convert.FromBase64String(base64EncodedKey)
我收到以下错误:
System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
好的,所以它给了我一些可能的错误,尽管据我所知,这是一个有效的64字符串。我决定找出它遇到的错误情况:
catch(FormatException fe)
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Error verifying purchase: " + fe);
if(decodedKey != null)
{
if(decodedKey.Length % 4 != 0)
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Incorrect length of base 64 string: " + decodedKey.Length);
}
else if(decodedKey.EndsWith("==="))
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Too many closing padding characters");
}
else
{
int firstPadding = decodedKey.IndexOf("=");
string padding = null;
if (firstPadding > -1)
{
padding = decodedKey.Substring(firstPadding);
}
Regex r = new Regex("[^=]*"); // any character but =
if(padding != null && r.IsMatch(padding))
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Illegal padding character " + padding);
}
else
{
Regex all = new Regex("[^0-9a-zA-Z\\+/=]"); // Any character but 0-9, a-z, A-Z, +, /, and =
if (all.IsMatch(decodedKey))
{
string matches = "";
foreach (Match match in all.Matches(decodedKey))
{
matches += " " + match.Value;
}
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Illegal base 64 character(s):" + matches);
}
else
{
string beforePadding;
if (firstPadding == -1)
{
beforePadding = decodedKey;
}
else
{
beforePadding = decodedKey.Substring(0, firstPadding);
}
if (beforePadding.Contains("="))
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Padding occurs at illegal position " + beforePadding.IndexOf("="));
}
else
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Unknown base 64 error, possibly .NET is full of crap");
}
}
}
}
}
else
{
m_logger.log(LogMsg.LOG_PRIORITY.ERROR, MethodBase.GetCurrentMethod().Name,
"Decoded key is null");
}
}
我在日志中收到的消息是"Unknown base 64 error, possibly .NET is full of crap"
。那我错过了什么?这不是有效的64字符串吗?
更新: 为了使这更简单,我在C#中对字符串进行了硬编码:
byte[] key = Convert.FromBase64String("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjFVH+fZ60DB7RZFiTePo9wJfkNu//TfODTJCiHv9cwwrxmiwVzHDXWhjzkgyUGBH08YO8bAMdzu4NALD3dlBux4QkSg2yvJmJjULCbaxSTE82aJDzjUOz7KoutTHFK0INFEiINWo7vdKSLiqiXpzfjCfV6DKRbM6DkKmEdFz1SOCWS+f8zs5gheke/ykI6JokzvD+Tw5n2AhHis7cuWJx8e/5BziPMLHbhsoYrpMzGl3SGqBKBoasxXiCgYfvS5RpI57oidGojvNbqsZBA30cbmX6IjXBs61O3zhgY25HKHp5yjHuMXNoNd4GY6Ya/l6yKPqNcKz1x37CP4NfkckbwIDAQAB");
仍然是同样的失败。不知道这是怎么发生的。我试图创建一个最小的例子(我只涉及.NET编程)并没有取得多大成功。