从阅读电子邮件中编码字符串
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()
只接受普通格式。因此,将 -
替换为 +
并将 _
替换为 /
以从一个转换为另一个是非常正确的。
我正在使用 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()
只接受普通格式。因此,将 -
替换为 +
并将 _
替换为 /
以从一个转换为另一个是非常正确的。