这几天遇到一个问题,解码说base64编码不合法,于是大致了解了一下base64编码原则。
base64编码就是使用64个基本字符来表示编码以后的字符,他们分别是A~Z, a~z,0~9,+ /
但还有一个特殊字符,等号 “=”,base64 编码是将源字节中的每3个字节编码成为目标字符中的4个字符。如果目标结果不足4个,则以等号 “=”补足。原则上来讲结尾有三个连续等号 “=”也不违反原则,一般有一个或两个,有没有可能有三个,我不想深究。
C#编码出的base64确实只含有这65个字符,但java不一定,今天接到的它们的结果中包含回车(ascii:13)和回车换行(ascii:8629),替换后就可以正常解码了。
部分C#代码如下:
void Main() { var base64chars = new List<char>(); for(int i=0;i<26;i++) base64chars.Add((char)(((int)'A') + i)); for (int i = 0; i < 26; i++) base64chars.Add((char)(((int)'a') + i)); for (int i = 0; i < 10; i++) base64chars.Add((char)(((int)'0') + i)); base64chars.Add('+'); base64chars.Add('/'); var str = File.ReadAllText(@"E:Desktopase64.txt").Replace(" ",string.Empty).Replace(((char)8629).ToString(),string.Empty); foreach (var c in str.TrimEnd('=')) { if(!base64chars.Contains(c)) System.Diagnostics.Debug.Print("ascii code:" + ((int)c).ToString() + ", display:" + c.ToString()); } var bytes = Convert.FromBase64String(str); File.WriteAllBytes(@"E:Desktop2.jpg",bytes); }