Java от Base64 Sun до JDK8
У меня есть куча строк в БД, которые были закодированы с sun.misc.BASE64Encoder
Некоторое время назад
Теперь я хочу декодировать (и кодировать дальнейшие строки) с java.util.Base64
,
Разница между этими двумя заключается в том, что Sun добавил новую строку строки в каждом n символов
Пример:
Sun Base64: 54y49568uyj304j534w5y
34y0639j6yh93j5h0653j
s45hr68o
JDK8 Base64: 54y49568uyj304j534w5y34y0639j6yh93j5h0653js45hr68o
Для того чтобы JDK-декодер проанализировал эти сжатые строки, мне нужно удалить символы новой строки.
Вопросы:
Я удаляю
\r\n
(Unix) или\n
(Windows) или\r
(старые Маки)? Потому что строки зависят от того, на какой машине они были закодированыЕсли я говорю
zippedString.replaceAll("\r", "").replaceAll("\n", "")
как я могу убедиться, что у меня не будет\r
Chacter в фактической строке, что приводит к повреждению данных?Есть ли другой способ создать мост между этими двумя механизмами?
2 ответа
В Base64 нет пробелов, поэтому я бы удалил все.
String toDecode = str.replaceAll("\\s+", "");
Это устраняет любую неопределенность в отношении того, как обрабатывать определенные символы новой строки или пробелы.
The purpose of '\r' and '\n' characters here is purely related to text formatting and you can assume they're invisible.
The code that reads the string value should take care of filtering them out, whatever method is used eg
read line -> trim -> concatenate
Then, decode the concatenated string.
As a digression, suppose a different encoding algorithm was applied with these characters being part of the encoding alphabet. Because Java interprets '\r' and '\n' characters as an indicator of a new line (depending on the operating system), the string representation of the encoded value would need to be escaped, eg “14y6\\n75b….”. However, this would've caused more problems than benefits hence should be avoided.