Java от Base64 Sun до JDK8

У меня есть куча строк в БД, которые были закодированы с sun.misc.BASE64Encoder Некоторое время назад

Теперь я хочу декодировать (и кодировать дальнейшие строки) с java.util.Base64,

Разница между этими двумя заключается в том, что Sun добавил новую строку строки в каждом n символов

Пример:

Sun Base64:   54y49568uyj304j534w5y
              34y0639j6yh93j5h0653j
              s45hr68o

JDK8 Base64:  54y49568uyj304j534w5y34y0639j6yh93j5h0653js45hr68o

Для того чтобы JDK-декодер проанализировал эти сжатые строки, мне нужно удалить символы новой строки.

Вопросы:

  1. Я удаляю \r\n (Unix) или \n (Windows) или \r (старые Маки)? Потому что строки зависят от того, на какой машине они были закодированы

  2. Если я говорю zippedString.replaceAll("\r", "").replaceAll("\n", "") как я могу убедиться, что у меня не будет \r Chacter в фактической строке, что приводит к повреждению данных?

  3. Есть ли другой способ создать мост между этими двумя механизмами?

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.

Другие вопросы по тегам