C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符,即填充字符中的非法字符
我试图将base64string转换为可读字符串,但它给出的错误是“输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上的填充字符或填充字符中的非法字符。” 但是,当我在在线转换器上执行相同操作时,例如,这里的,它正在工作C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符,即填充字符中的非法字符,c#,asp.net-core,base64,C#,Asp.net Core,Base64,我试图将base64string转换为可读字符串,但它给出的错误是“输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上的填充字符或填充字符中的非法字符。” 但是,当我在在线转换器上执行相同操作时,例如,这里的,它正在工作 string base64String="DQpUZXN0DQoNCkNvbmZpZGVudGlhbGl0eSBOb3RpY2U6IFRoaXMgZS1tYWlsLCBhbmQgYW55IGF0dGFjaG1lbnQgdG8gaXQsIGNvbnRha
string base64String="DQpUZXN0DQoNCkNvbmZpZGVudGlhbGl0eSBOb3RpY2U6IFRoaXMgZS1tYWlsLCBhbmQgYW55IGF0dGFjaG1lbnQgdG8gaXQsIGNvbnRhaW5zIHByaXZpbGVnZWQgYW5kIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBpbnRlbmRlZCBvbmx5IGZvciB0aGUgdXNlIG9mIHRoZSBpbmRpdmlkdWFsKHMpIG9yIGVudGl0eSBuYW1lZCBvbiB0aGUgZS1tYWlsLiBJZiB0aGUgcmVhZGVyIG9mIHRoaXMgZS1tYWlsIGlzIG5vdCB0aGUgaW50ZW5kZWQgcmVjaXBpZW50LCBvciB0aGUgZW1wbG95ZWUgb3IgYWdlbnQgcmVzcG9uc2libGUgZm9yIGRlbGl2ZXJpbmcgaXQgdG8gdGhlIGludGVuZGVkIHJlY2lwaWVudCwgeW91IGFyZSBoZXJlYnkgbm90aWZpZWQgdGhhdCByZWFkaW5nIHRoaXMgZS1tYWlsIGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIElmIHlvdSBoYXZlIHJlY2VpdmVkIHRoaXMgZS1tYWlsIGluIGVycm9yLCBwbGVhc2UgaW1tZWRpYXRlbHkgcmV0dXJuIGl0IHRvIHRoZSBzZW5kZXIgYW5kIGRlbGV0ZSBpdCBmcm9tIHlvdXIgc3lzdGVtLg0K=";
var bytes = Convert.FromBase64String(base64String);
var decodededString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(decodededString );
看到这个了吗
输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上的填充字符或填充字符中的非法字符
从错误消息中,您应该检查base64string的长度是否是4的倍数
并且base64string是有效的
Base64字符串将仅由字符“A'..'Z”、“A'..'Z”、“0'..'9'、“+”、“/”组成,并且通常在末尾填充最多两个“=”,以使长度为4的倍数
正如madreflection所评论的,您原来的Base64字符串长度是713,而不是4的倍数,您应该删除最后一个“=”填充字符以使Base64字符串有效。我找到了答案。
以下是将任何base64字符串转换为可读utf8字符串的示例代码:
static string GetStringFromBase64String(string msg)
{
string _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
StringBuilder msgString = new StringBuilder();
int len = 0;
while (len < msg.Length)
{
int enc1 = _keyStr.IndexOf(msg[len++]);
int enc2 = _keyStr.IndexOf(msg[len++]);
int enc3 = _keyStr.IndexOf(msg[len++]);
int enc4 = _keyStr.IndexOf(msg[len++]);
int chr1 = (enc1 << 2) | (enc2 >> 4);
int chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
int chr3 = ((enc3 & 3) << 6) | enc4;
msgString.Append(Convert.ToChar(chr1));
if (enc3 != 64)
{
msgString.Append(Convert.ToChar(chr2));
}
if (enc4 != 64)
{
msgString.Append(Convert.ToChar(chr3));
}
}
string final = GetUtf8String(msgString.ToString());
return final;
}
static string GetUtf8String(string msg)
{
string utftext = "";
msg = msg.Replace("\r", "");
msg = msg.Replace("\n", "");
msg = msg.Replace("\r\n", "");
msg = msg.Replace("\r\r", "");
msg = msg.Replace("\n\n", "");
msg = msg.Replace("\\r", "");
msg = msg.Replace("\\n", "");
msg = msg.Replace("\\r\\n", "");
msg = msg.Replace("\\r\\r", "");
msg = msg.Replace("\\n\\n", "");
for (var n = 0; n < msg.Length; n++)
{
int c = msg[n];
if (c < 128)
{
utftext += Convert.ToChar(c);
}
else if ((c > 127) && (c < 2048))
{
utftext += Convert.ToChar((c >> 6) | 192);
utftext += Convert.ToChar((c & 63) | 128);
}
else
{
utftext += Convert.ToChar((c >> 12) | 224);
utftext += Convert.ToChar(((c >> 6) & 63) | 128);
utftext += Convert.ToChar((c & 63) | 128);
}
}
return utftext;
}
静态字符串GetStringFromBase64String(字符串消息)
{
字符串_keyStr=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789+/=”;
StringBuilder msgString=新的StringBuilder();
int len=0;
while(长度4);
int chr2=((enc2&15)>2);
int chr3=((enc3&3)127)和&(c<2048))
{
utftext+=Convert.ToChar((c>>6)| 192);
utftext+=Convert.ToChar((c&63)| 128);
}
其他的
{
utftext+=Convert.ToChar((c>>12)| 224);
utftext+=Convert.ToChar((c>>6)和63)| 128);
utftext+=Convert.ToChar((c&63)| 128);
}
}
返回utftext;
}
当您反转该过程时,即从预期的文本开始,称为GetBytes
,然后是ToBase64String
,您得到了什么?此值上不需要填充字符。它是怎么到达那里的?有712个字符没有=
,712可以被4整除。不需要填充。将您的字符串显示为格式错误(打开实时模式)。请参阅我附带的有问题的屏幕截图