从阅读电子邮件中编码字符串

Encoding string from reading email

我正在使用 Gmail API 阅读来自 Gmail 帐户的电子邮件。

在正文中,我正在替换一些我在论坛中阅读时需要的字符:

 String codedBody = body.Replace("-", "+");
 codedBody = codedBody.Replace("_", "/");

问题是当我尝试转换它时

byte[] data = Convert.FromBase64String(codedBody);

有一些电子邮件触发的异常:

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.'

来自请求的字符串是:

"0J7QsdGP0LLQsDogSGVhbHRoY2FyZSBTZXJ2aWNlIFJlcHJlc2VudGF0aXZlIHdpdGggRHV0Y2gsIEdlcm1hbiANCiDQktCw0LbQvdC-ISDQnNC-0LvRjywg0L3QtSDQvtGC0LPQvtCy0LDRgNGP0LnRgtC1INC90LAg0YLQvtC30LggZW1haWwuICANCiAg0KLQvtC30LggZW1haWwg0LUg0LjQt9C_0YDQsNGC0LXQvSDQv9GA0LXQtyBqb2JzLmJnINC-0YIg0LjQvNC10YLQviDQvdCwINCa0YDQuNGB0YLQuNCw0L0g0JrRitC90LXQsiAg0JfQsCDQtNCwINGB0LUg0YHQstGK0YDQttC10YLQtSDRgSDQutCw0L3QtNC40LTQsNGC0LAg0YfRgNC10LcgZW1haWwg0LjQt9C_0L7Qu9C30LLQsNC50YLQtToga3Jpc3RpYW5fdG9uaUBhYnYuYmcgIA0KICDQodGK0L7QsdGJ0LXQvdC40LUg0L7RgiDQutCw0L3QtNC40LTQsNGC0LA6ICANCiAg0LHQu9Cw0LHQu9Cw0LHQu9Cw0LHQu9CwDQoNCg0KDQoNCg0KICA=PEhUTUw-PEJPRFk-DQrQntCx0Y_QstCwOiBIZWFsdGhjYXJlIFNlcnZpY2UgUmVwcmVzZW50YXRpdmUgd2l0aCBEdXRjaCwgR2VybWFuPGRpdj48YnI-PGRpdj7QktCw0LbQvdC-ISDQnNC-0LvRjywg0L3QtSDQvtGC0LPQvtCy0LDRgNGP0LnRgtC1INC90LAg0YLQvtC30LggZW1haWwuPC9kaXY-PGRpdj48YnI-PC9kaXY-PGRpdj7QotC-0LfQuCBlbWFpbCDQtSDQuNC30L_RgNCw0YLQtdC9INC_0YDQtdC3IGpvYnMuYmcg0L7RgiDQuNC80LXRgtC-INC90LAg0JrRgNC40YHRgtC40LDQvSDQmtGK0L3QtdCyPC9kaXY-PGRpdj7Ql9CwINC00LAg0YHQtSDRgdCy0YrRgNC20LXRgtC1INGBINC60LDQvdC00LjQtNCw0YLQsCDRh9GA0LXQtyBlbWFpbCDQuNC30L_QvtC70LfQstCw0LnRgtC1OiBrcmlzdGlhbl90b25pQGFidi5iZzwvZGl2PjxkaXY-PGJyPjwvZGl2PjxkaXY-0KHRitC-0LHRidC10L3QuNC1INC-0YIg0LrQsNC90LTQuNC00LDRgtCwOjwvZGl2PjxkaXY-PGJyPjwvZGl2PjxkaXY-0LHQu9Cw0LHQu9Cw0LHQu9Cw0LHQu9CwPGJyPjxicj48YnI-PGJyPjxicj48YnI-PC9kaXY-PC9kaXY-PC9CT0RZPjwvSFRNTD4NCg=="

是什么导致了这个问题?

您的源 Base64 字符串无效。它在字符串中间的位置 604 处包含一个填充字符 =

看起来好像您有两个连接在一起的有效 Base64 字符串。返回您的来源并确保您正确收集它们。

来源必须提供一些详细信息,因为 Base64 本身无法确定您是否有两个值这样连接。如果第一个源字节数组的长度是3的倍数,那么中间就没有填充字符了,就解码成功了,给出了垃圾。

就其价值而言,替换这些字符似乎是正确的,因为在 Base64 中没有使用两个符号字符的实际标准。但是,请确保您正确地掌握了它们。

更新

进一步调查(学习很有趣)有一个定义的 Base64 标准,它定义了两个单独的 Base64 编码。

The Base 64 Alphabet为两个符号定义了+/,为填充字符定义了=

相同的 RFC 还指定了 The "URL and Filename safe" Base 64 Alphabet,它使用 -_ 作为两个符号,并使用 =(或 %3D)作为填充字符。

您的源数据似乎使用“URL 和文件名安全”格式,而 FromBase64String() 只接受普通格式。因此,将 - 替换为 + 并将 _ 替换为 / 以从一个转换为另一个是非常正确的。