c# - 解码 Google 的 Base64
问题描述
我试图从 Googles Gmail API 解码 Base64 字符串,
字符串是:
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ-DQo8bWV0YSBodHRwLWVxdWl2PSJ-
我用了:
Convert.FromBase64String(Base64String);
但我也尝试了谷歌的“Google.Protobuf”包:
ByteString.FromBase64(Base64String);
两者都抛出错误
FormatException:输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。
在线解码器https://www.base64decode.org/没有问题 解码字符串来自谷歌的
Gmail Api ( message.Payload.Body.Data
)
这里是一个快速在线项目
解决方案
您的输入看起来像 RFC 4648 §5 base-64,即没有填充和用-
而不是+
和_
而不是/
。Convert.FromBase64String
想要带有填充的 RFC 4648 §4 base-64。这有效,例如:
string s = @"PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ-DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4NCjx0aXRsZT5WZXJpZmljYXRpb24gRW1haWw8L3RpdGxlPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiLz4NCjxzdHlsZT4NCnRkIHtwYWRkaW5nLXJpZ2h0OjE1cHg7DQpwYWRkaW5nLWxlZnQ6MTVweDt9DQp0aCB7cGFkZGluZy1yaWdodDoxNXB4Ow0KcGFkZGluZy1sZWZ0OjE1cHg7fQ0KcCB7cGFkZGluZzogNXB4O30NCjwvc3R5bGU-DQo8L2hlYWQ-DQo8Ym9keSBzdHlsZT0ibWFyZ2luOiAwOyBwYWRkaW5nOiAwOyI-DQogPHA-RmFzdCBnZXNjaGFmZnQsPC9wPg0KIDxwPm51ciBub2NoIGVpbmVuIFNjaHJpdHQg4oCTIGRlciBLbGljayBhdWYgZGVuIGZvbGdlbmRlbiBMaW5rIGJlc3TDpHRpZ3QgZGVpbmUgenVtIE5ld3NsZXR0ZXIuIEhlcnpsaWNoZW4gRGFuayE8L3A-DQogPHA-QW5tZWxkdW5nIGJlc3TDpHRpZ2VuIDwvcD4NCiA8YSBocmVmPSJodHRwczovL3Rlc3QtYXBwLmJsdW1lMjAwMC5kZS9teS1tZW51L3Byb2ZpbGU_c3Vic2NyaWJlPVRydWUmc3Vic2NyaXB0aW9uSWQ9MTAiPiBodHRwczovL3Rlc3QtYXBwLmJsdW1lMjAwMC5kZS9teS1tZW51L3Byb2ZpbGU_c3Vic2NyaWJlPVRydWUmc3Vic2NyaXB0aW9uSWQ9MTA8L2E-DQo8YnI-DQo8cD5EZWluIEJMVU1FIDIwMDAtVGVhbTwvcD48L2JvZHk-DQo8L2h0bWw-";
s = s.Replace('-', '+').Replace('_', '/'); // change alphabet
byte[] b = Convert.FromBase64String(s);
如果其他输入抱怨填充差异,您需要手动添加填充,例如:
s = s.Replace('-', '+').Replace('_', '/') + (s.Length % 4) switch {
2 => "==",
3 => "=",
_ => "",
};
推荐阅读
- windows - 在通过批处理文件启动应用程序之前等待任务完成 (Windows)
- c++ - 如何使用 lambda 找到最小距离
- python - Python 中包含哪些数据 int 对象?
- javascript - 如何并行遍历目录树?
- ruby - 在哈希迭代器中使用 proc 而不是块
- ubuntu - pip3 无法在 Windows 10 上的 Ubuntu 20.04 LTS 上创建虚拟环境,因为 ensurepip 不可用
- python - “‘numpy.ndarray’对象不可调用”在我的机器学习代码中
- python - 替换 set() 以保留重复项
- azure - Azure ARM 模板中的函数
- css - 网格动画的 Safari 问题