Java Android - как я декодирую сообщение данных тела BASE64URL в UTF-8

У меня есть этот JSON из GMAIL API: Части тела сообщения (получить сообщение gmail api)

текст/обычный

SGVsbG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tLyBhbmQgdGhhbmsgeW91IGZvciB5b3VyIGhlbHAhLg0K

текст/html

PGRpdiBkaXI9Imx0ciI-PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZiI-SGVsbG_CoDxhIGhyZWY9Imh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS8iPmh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS88L2E-IGFuZCB0aGFuayB5b3UgZm9yIHlvdXIgaGVscCEuPC9kaXY-PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZiI-PGJyPjwvZGl2PjxkaXY-PGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3NpZ25hdHVyZSIgZGF0YS1zbWFydG1haWw9ImdtYWlsX3NpZ25hdHVyZSI-PGRpdiBkaXI9Imx0ciI-PGRpdj48ZGl2IGRpcj0ibHRyIj48ZGl2PjxkaXYgZGlyPSJsdHIiPjxkaXY-PGRpdiBkaXI9Imx0ciI-PC9kaXY-PC9kaXY-PC9kaXY-PC9kaXY-PC9kaXY-PC9kaXY-PC9kaXY-PC9kaXY-DQo8L2Rpdj4NCg==

Я не могу декодировать сообщение, text/plain или text/html. Я пробовал много способов, но не работал.

//result can be text/plain or text/html string from above
import android.util.Base64;
String orig = result.replaceAll("-","+").replaceAll("_","/");
byte[] a = Base64.decode(orig, Base64.DEFAULT); // byte[] result have content
String emailResult = new String(a,"UTF-8");
Log.i("EMAIL ", emailResult); //blank result
//or - also tried 
import com.google.api.client.util.Base64;
String c = new String(Base64.decodeBase64(result));
Log.i("EMAIL ", a); // a is blank

длина результата должна быть кратна 4? Нужно ли удалять символы и заменять их на ==s?


person Daniel    schedule 25.07.2016    source источник


Ответы (1)


person    schedule
comment
@ Даниэль Ты прав. Я обновил ответ. Это работает? - person Tholle; 26.07.2016
comment
Хотя код часто говорит сам за себя, полезно добавить к нему некоторые пояснения. Это всплыло в очереди на проверку, как это обычно бывает с ответами, содержащими только код. - person Will; 27.07.2016
comment
SGVsbG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tLyBhbmQgdGhhbmsgeW91IGZvciB5b3VyIGhlbHAhLg0K это работает, если декодировать, если я удалю последние два символа или добавлю == в конце строки, почему? - person Daniel; 28.07.2016
comment
Вы пробовали это? - person Tholle; 28.07.2016
comment
Я пробовал безуспешно. До сих пор нет документации о декодировании сообщений gmail api из base64url в UTF-8, что нужно изменить в теле сообщения, чтобы преобразовать в base64, а затем преобразовать в String и т. Д. - - person Daniel; 29.07.2016
comment
@Tholle вот в чем дело, дело не в процессе декодирования, проблема в результате JSON GMAIL API, если я удалю последние 2, 3 или 4 символа, декодирование работает, теперь вопрос в том, почему это так? и какая логика удалять 2, 3 или 4 символа... - person Daniel; 31.07.2016
comment
@ Даниэль, я понятия не имею. Вам не нужно удалять конечный отступ =, например. JavaScript, но должно быть решение. decodeURIComponent(escape(atob(result.replace(/\-/g, '+').replace(/\_/g, '/')))) работает на JavaScript. - person Tholle; 31.07.2016
comment
Толле все равно спасибо! @GMAILAPI любой инженер gmail API, который может объяснить эту логику? - person Daniel; 31.07.2016