虽然这看起来很容易修复,但我的.net应用程序由于某种原因根本没有将其视为有效的base64字符串。
我使用GMail API来获取消息,在我尝试检索正文的最后一部分,我遇到了以下错误消息:
抛出异常:' System.FormatException'在mscorlib.dll中 System.FormatException:输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符, 或填充字符中的非法字符 在System.Convert.FromBase64_ComputeResultLength(Char * inputPtr,Int32 inputLength)
中的wForm.Form1.d__9.MoveNext()
在System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)
在System.Convert.FromBase64String(String s)
在E:\Programs\Programming\wForms\wForm\wForm\Form1.cs:line 127
这是编码的字符串(在其他应用程序中解码很好,例如utilities-info网站): https://pastebin.ca/3893521
我的代码用于加载Windows窗体并获取这些消息:
private async void Form1_Load(object sender, EventArgs e)
{
txtEmail_ID.Focus();
try
{
requestLabel = service.Users.Labels.List("me");
requestMessage = service.Users.Messages.List("me");
//requestMessage.LabelIds = "INBOX";
//requestMessage.IncludeSpamTrash = false;
// requestMessage.Q = "is:unread";
var messageResponse = await requestMessage.ExecuteAsync();
if (messageResponse != null && messageResponse.Messages != null)
{
foreach (var message in messageResponse.Messages)
{
var currentMessage = new messageInfo();
var requestNestedMessage = service.Users.Messages.Get("me", message.Id);
var nestedMessageResponse = await requestNestedMessage.ExecuteAsync();
if (nestedMessageResponse != null) // Check if we have nested params
{
foreach (var mParts in nestedMessageResponse.Payload.Headers) // Loop msg headers
{
if (mParts.Name == "Date")
{
currentMessage.msgDate = mParts.Value; // Get msg date
}
else if (mParts.Name == "From")
{
currentMessage.msgSender = mParts.Value; // Get msg sender
}
else if (mParts.Name == "Subject")
{
currentMessage.msgTitle = mParts.Value; // Get msg subject
}
}
if (nestedMessageResponse.Payload.Parts == null && nestedMessageResponse.Payload.Body != null)
{
currentMessage.msgBody = nestedMessageResponse.Payload.Body.Data;
}
else
{
currentMessage.msgBody = returnNestedParts(nestedMessageResponse.Payload.Parts, "");
}
Console.WriteLine(currentMessage.msgSender);
String codedString = currentMessage.msgBody.Replace("-", "+");
codedString = codedString.Replace("_", "/");
byte[] data = Convert.FromBase64String(codedString);
currentMessage.msgBody = Encoding.UTF8.GetString(data);
mInfo.Add(currentMessage);
}
}
}
} catch (Exception ex)
{
Console.WriteLine(ex);
}
//comboFolders.SelectedIndex = 0;
}
该程序会在它获取的每条消息以及" Line 127"上抛出异常。是" byte []数据"
我尝试在这个论坛中搜索类似的问题,然而,他们的解决方案似乎都没有起作用,因为大多数解决方案只是将 - 和_符号更改为适合的base64url类型。
答案 0 :(得分:1)
我已经解决了这个问题,将其缩小到有效载荷部分。当我想要将消息的两个有效负载部分连接在一起时,会出现错误,导致尾随的“=”符号未被处理,因此会对我自己造成异常。