无法转换Convert.FromBase64String base64编码的字符串

时间:2020-07-13 10:40:39

标签: c#

“eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ”

当我在上述字符串上尝试 Convert.FromBase64String 时,出现错误提示
该输入不是有效的Base-64字符串,因为它包含非base 64字符,两个以上的填充字符或填充字符中的非法字符

我什至在字符串的末尾添加了=符号,但是它不起作用 但是当我在Notepad ++中解码相同的字符串时,我得到了JSON数据。

2 个答案:

答案 0 :(得分:4)

如Crowcoder所述,未正确填充字符串。可以用0、1或2个等号(=)填充base64字符串,某些实现对此并不在意,但某些实现则可以(例如Convert.FromBase64String)。您想要的是一个可被4整除的字符串长度,如果不是,则用等号填充它。

类似这样的东西。

var str = "eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ";

if(str.Length % 4 != 0)
  str += new String('=', 4 - str.Length % 4);

Convert.FromBase64String(str);

答案 1 :(得分:1)

用于填充原始字符串的代码段:

        var base64Source = "eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ";
        var requiredPadding = 4 - base64Source.Length % 4;
        if (requiredPadding > 0)
        {
            base64Source += new string(Enumerable.Repeat('=', requiredPadding).ToArray());
        }
        var result = Convert.FromBase64String(base64Source);