【问题标题】:Encoding string from reading email从阅读电子邮件中编码字符串
【发布时间】:2018-02-05 12:41:26
【问题描述】:

我正在使用 Gmail API 从 Gmail 帐户读取电子邮件。

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

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

问题是当我尝试转换它时

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

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

System.FormatException: '输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。'

来自请求的字符串是:

“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 ==“ P>

是什么导致了这个问题?

【问题讨论】:

标签: c# string encoding base64 decoding


【解决方案1】:

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

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

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

不管怎样,替换这些字符似乎是正确的,因为在 Base64 中没有使用两个符号字符的事实上的标准。但是,请确保您已正确了解它们。

更新

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

The Base 64 Alphabet 定义 +/ 用于两个符号,= 用于填充字符。

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

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

【讨论】:

  • 你是对的。我收到了纯文本格式和文本 html 格式的响应,因此它将这两种格式合二为一并导致了问题。如果我将响应分成 2 个单独的部分,一切都很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2023-03-31
  • 2021-05-31
相关资源
最近更新 更多