c# - 无法 Convert.FromBase64String 一个 base64 编码的字符串
问题描述
"eyJwYXltZW50SWQiOiI1ZjBjMmJmZmFiNDRlMjJjNjhiZWUzMDkiLCJjdXN0b21lckRldGFpbHMiOnsiZmlyc3ROYW1lIjoiY3NKb2huMSIsImxhc3ROYW1lIjoiY3NEb2UxIiwidXNlcklkIjoiNWVmNGI1OGZkYjUyZjk1ZGY4NWYwMjg0In0sIm9yZGVyRGV0YWlscyI6eyJvcmRlcklkIjoiNWYwYzJiZmZmYjVkYTIzNTcwYjhjM2JhIiwiY3VycmVuY3kiOm51bGwsImFtb3VudCI6IjU0LjAwIn0sIm1lcmNoYW50RGV0YWlscyI6eyJuYW1lIjoiRENQIn0sImlhdCI6MTU5NDYzMzIxNSwiZXhwIjoxNTk0NjMzODE1fQ"
当我在上面的字符串上尝试Convert.FromBase64String时,我收到一条错误消息:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符
我什至在字符串的末尾添加了 = 符号,但它没有用,但是当我在 Notepad++ 中解码相同的字符串时,我得到了 JSON 数据。
解决方案
正如 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);
推荐阅读
- angular - Angular 应用程序的角色和权限工具
- c# - C#创建距离为100km的经纬度地图字典
- r - 停用词不能删除 R 中的单词
- matplotlib - 在同一进程中将 matplotlib 与 Qt5 后端一起使用并运行现有 QApplication
- asp.net - 无法使用 Windows 7 SP1 在 IIS 7.5 中添加 ASP.NET 组件
- c# - System.Text.Json 将字典序列化为数组
- javascript - 角度路由 - 在路由到子节点时,仅在页面刷新时查看更新
- html - 使所有列宽等于最宽列的长度
- cmd - FFmpeg .jpg 图像到 .mp4 与 Windows Media Player 不兼容
- php - 迁移不会把“独特”放在我的桌子上