Ответ 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());
Мне нужно сделать кодировку 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)
Не могли бы вы попробовать...
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());
Base64.encode(bytes).toString()
не возвращает Base64.encode(bytes).toString()
строку.
Вы должны использовать
new String(Base64.encode(bytes))
как предложено iccthedral.
String stringToStore = Base64.encode(bytes).toString();
Это не превращает байты в строку. Это строковое представление Java объекта (например, "[[email protected]"
). Вам нужно сделать то, что предлагает iccthedral, и предоставить байты классу String.
Если вы используете Android API 8+, там Base64
вспомогательный класс в android.util
.
String stringToStore = Base64.encodeToString(cipherText, Base64.DEFAULT);
Это работает для меня:
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())
)Изначально, если вы используете это для паролей, его не рекомендуется конвертировать в строки. Для использования в качестве строки выполните следующий сегмент кода
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());
Base64.decode()
появляется возвращает byte\[\]
. Вызов toString()
дает вам описание Java по умолчанию по умолчанию, не похоже на "56AB0FC3...". Вам нужно будет сделать это преобразование самостоятельно.
Аналогично, ваш вызов getBytes()
не делает ничего, что вы думаете.
Я попробовал 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]
Чтобы декодировать массив байтов, который содержит содержимое 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);