Ошибка при попытке кодирования/декодирования String на Base64

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

Я пытаюсь кодировать массив байтов в строку с использованием кодировки 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)

Ответы

Ответ 1

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

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()); 

Ответ 2

Base64.encode(bytes).toString() не возвращает Base64.encode(bytes).toString() строку.

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

new String(Base64.encode(bytes))

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

Ответ 3

String stringToStore = Base64.encode(bytes).toString();

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

Ответ 4

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

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

Ответ 5

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

        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() на a String. encode(bytes) метод уже возвращает String (как отмечают другие, вызывающие это могут быть причиной ошибки)
  • Зачем конвертировать в байты, когда ему не нужен только код (Base64.decode(stringToStore.getBytes()))

Ответ 6

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

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

Ответ 7

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

Аналогично, ваш вызов getBytes() не делает ничего, что вы думаете.

Ответ 8

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

    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]

Ответ 9

Чтобы декодировать массив байтов, который содержит содержимое contais 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);