首页 > 解决方案 > 无法 Convert.FromBase64String 一个 base64 编码的字符串

问题描述

"eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ"

当我在上面的字符串上尝试Convert.FromBase64String时,我收到一条错误消息:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符

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

标签: c#

解决方案


正如 Crowcoder 指出的那样,该字符串未正确填充。base64 字符串可以用 0、1 或 2 个等号 (=) 填充,有些实现不关心这一点,但有些实现(如 Convert.FromBase64String)。你想要的是一个可被 4 整除的字符串长度,如果不是,你用等号填充它。

像这样的东西。

var str = "eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ";

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

Convert.FromBase64String(str);

推荐阅读