在我的C#应用程序中,我有一个Bitmap编码为从android应用程序发送的base64字符串,然后我解码它并将其设置为等于字节数组。
我得到了这个例外:
“发生了'System.FormatException'类型的第一次机会异常 mscorlib.dll中”。
Android Side:
byte[] iconByteArray = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos); //Bitmap bitmap created elsewhere
iconByteArray = baos.toByteArray();
encodedIcon = Base64.encodeToString(iconByteArray, Base64.DEFAULT);
return encodedIcon;
C#Side:
byte[] arr = System.Convert.FromBase64String(encodedIcon); //this throws that exception
有谁知道原因?我猜测Java中的Base64字符串格式无法通过C#应用程序进行简单解码?看起来我可能需要做something like this并替换一些字符?我尝试了这个解决方案并得到了同样的例外。
通过Android发送的字符串如下所示
“/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK \ nCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT / 2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU \ nFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT / wAARCABgAGADASIA \ nAhEBAxEB / 8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL / 8QAtRAAAgEDAwIEAwUFBAQA \ nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 \ nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm \ np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4 + Tl5ufo6erx8vP09fb3 + PN6 / 8QAHwEA \ nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL / 8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx \ nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK \ nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 \ nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 + PN6 / 9oADAMBAAIRAxEAPwD8qq2t \ nG8EeIvENqbrStC1PUrYMUM1pZyyoGHUZVSM8jj3rFr9av2Ipl + Gf7PHh + xn1qfzNQL6rttY5AsYm \ nCsEPzDJAHJx3roo4atiW1QjzNHBi8fhcBFSxU + VPRaN / kmfl9 / wqrxp / 0KWu / wDgsn / + IO / 4VV40 \ N / wChS13 / AMFk / wD8RX7cj4m“
答案 0 :(得分:3)
尝试
encodedIcon = encodedIcon.Replace(@"\n", "");
if(encodedIcon.Length % 4 != 0)
// we may have 0, 1 or 2 padding '='
encodedIcon += new string('=', 4 - encodedIcon.Length % 4);
byte[] arr = System.Convert.FromBase64String(encodedIcon);
根据Base64:
对非填充数据进行编码后,如果24位缓冲区的两个八位字节填充为零,则两个" ="字符被附加到输出;如果24位缓冲区的一个八位字节填充了填充零,则一个" ="附加字符。这向解码器发信号通知应该从重建数据中排除由于填充而添加的零比特。这也保证了编码输出长度是4个字节的倍数。
答案 1 :(得分:0)
在这一行
encodedIcon = Base64.encodeToString(iconByteArray, Base64.DEFAULT);
您可以将Base64.DEFAULT
更改为Base64.NOWRAP
从编码字符串中删除\n
。