it-roy-ru.com

Ошибка при попытке кодировать/декодировать строку в Base64

Мне нужно сделать Base64 кодирование из байтового массива для перемешивания, в отличие от другого байтового массива. Но когда я декодирую его обратно, я получаю исключение. Вот код

Я пытаюсь закодировать массив байтов в строку с использованием кодировки Base64. Когда я кодирую, это, кажется, работает, но когда я декодирую, это вызывает исключение. Что я делаю неправильно?

import org.springframework.security.crypto.codec.Base64;

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9};
String stringToStore = Base64.encode(bytes).toString();
byte[] restoredBytes = Base64.decode(stringToStore.getBytes());

Вот исключение, которое я получаю:

org.springframework.security.crypto.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 91 in array position 0
at org.springframework.security.crypto.codec.Base64.decode(Base64.Java:625)
at org.springframework.security.crypto.codec.Base64.decode(Base64.Java:246)
16
user1651914

Не могли бы вы попробовать ...

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = new String(Base64.encode(bytes));
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 
16
nullpotent

Base64.encode (bytes) .toString () не возвращает ожидаемую строку.

Вы должны использовать 

new String(Base64.encode(bytes))

как предложено iccthedral.

4
Samuel

Если вы используете Android API 8+, в Base64 есть класс Android.util

String stringToStore =  Base64.encodeToString(cipherText, Base64.DEFAULT);
2
scottyab

Первоначально, если вы используете это для паролей, не рекомендуется конвертировать в строки. Для использования в качестве строки следуйте следующему сегменту кода 

 byte [] bytes = новый байт [] {1,2,3,4,5,6,7,8,9}; 
 String stringToStore = new String (Base64.encode (bytes), "UTF-8"); 
 byte [] restoreBytes = Base64.decode (stringToStore.getBytes ()); 

1
PRASA7

Это работает для меня:

        byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        String stringToStore = Base64.encode(bytes);
        //System.out.println(stringToStore);//AQIDBAUGBwgJ
        byte[] restoredBytes = Base64.decode(stringToStore);
        //System.out.println(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

Я немного отредактировал это:

  • Не вызывайте toString() для String. Метод encode(bytes) уже возвращает String (как отмечают другие, вызывающие это может быть причиной ошибки)
  • Зачем преобразовывать в байты, когда не нужно просто больше кода (Base64.decode(stringToStore.getBytes()))
1
David Kroukamp
String stringToStore = Base64.encode(bytes).toString();

Это не превращает байты в строку. Это строковое представление Java объекта (например, "[[email protected]"). Вы должны сделать то, что предлагает iccthedral и предоставить байты для класса String.

1
John Szakmeister

Чтобы декодировать байтовый массив, который содержит контент base64, вы можете использовать javax.xml.bind.DatatypeConverter . Это работает довольно хорошо. Я использую его для декодирования значений MongoDB двоичного типа.

String testString = "hi, I'm test string";
byte[] byteArrayBase64 = org.Apache.commons.codec.digest.DigestUtils.md5(testString);
String decoded = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArrayBase64);
assert testString.equals(decoded);
0
albgorski

Я пробовал Base64 из кодека Apache , и результат в порядке.

    import org.Apache.commons.codec.binary.Base64;
    byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Base64 base64 = new Base64();
    byte[] stringToStore = base64.encode(bytes);
    System.out.print(Arrays.toString(stringToStore));//[65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74]
    byte[] restoredBytes = base64.decode(stringToStore);
    System.out.print(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
0
wodong

Base64.decode() появляется для возвращает byte\[\] . Вызов toString() дает вам некоторое описание Java массива по умолчанию, ничего похожего на «56AB0FC3 ...». Вам нужно было бы сделать это преобразование самостоятельно.

Точно так же ваш звонок в getBytes() совершенно не соответствует вашим ожиданиям.

0
Sean Owen