C#中的Base64字符串无效

时间:2017-08-29 18:02:02

标签: c# .net base64

我从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编程)并没有取得多大成功。

0 个答案:

没有答案