2016-02-09 4 views
5

У меня есть строка, кодированная base64. Это выглядит следующим образом:Base64: массив входных байтов имеет неправильный конечный байт при 40

eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0= 

Любой онлайн инструмент может расшифровать это соответствующую строку, которая {"bla1":"bla1","bla2":"bla2"}. Тем не менее, моя реализация Java не удается:

import java.util.Base64; 
System.out.println("payload = " + payload); 
String json = new String(Base64.getDecoder().decode(payload)); 

Я получаю следующее сообщение об ошибке:

payload = eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0= 
java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 40 

Что случилось с моим кодом?

+0

[Невозможно воспроизвести] (http://ideone.com/z07TWN), дополнительный символ в конце строки поднимет это точное исключение ... –

+0

Но откуда вы получаете кодированную строку? как вы передаете его переменной полезности ?, потому что, как вы говорите, она работает ... Я только что протестировал ее с помощью Java 8 и никаких проблем. –

ответ

8

Хорошо, я узнал. Исходная строка кодируется на устройстве Android, используя android.util.Base64 по Base64.encodeToString(json.getBytes("UTF-8"), Base64.DEFAULT);. Он использует схему кодирования android.util.Base64.DEFAULT.

Затем на стороне сервера при использовании java.util.Base64 это должно быть расшифрованы с Base64.getMimeDecoder().decode(payload)не с Base64.getDecoder().decode(payload)

+0

Это сработало для меня, спасибо. –

0

Я пытался использовать строки из арг. Я обнаружил, что если я использую arg[0].trim(), это заставило его работать. например

Base64.getDecoder().decode(arg[0].trim()); 

Я думаю, что есть какие-то пробелы, из-за которых это испортилось.