2015-06-21 1 views
0

я по существу иметь точную напротив проблемы, какJava 8 Base64 Encode (Basic) больше не добавляет новую строку. Как я могу переопределить это?

new-line-appending-on-my-encrypted-string

Похоже старой утилиты Java Base64 всегда добавляет новые строки каждые 76 символов при возврате строки, но используя следующий код, я не Мне нужны эти перерывы.

Path path = Paths.get(file); 
    byte[] data = Files.readAllBytes(path); 
    String txt= Base64.getEncoder().encodeToString(data); 

Есть ли простой способ сказать кодировщику, чтобы добавить новые строки?

Я попытался внедрить строковый конструктор, чтобы вставлять символы новой строки, но он меняет весь вывод (я копирую текст из java-консоли в редактор HxD и сравниваю с моим известным рабочим «BLOB» с символами новой строки).

String txt= Base64.getEncoder().encodeToString(data); 

    //Byte code for newline 
    byte b1 = 0x0D; 
    byte b2 = 0x0A;  

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < txt.length(); i++) { 
     if (i > 0 && (i % 76 == 0)) { 
      sb.append((char)b1); 
      sb.append((char)b2); 

     } 

     sb.append(txt.charAt(i)); 
    } 

EDIT (в ответ на вопрос):

Это не самая простая вещь, чтобы объяснить, но когда я не использую строку строитель, выход закодировать начнет так:

AAAAPAog4lBVgGJrT2b + mQVicHN3d //////// 3hhcDJiLWVtMjUwLWVtMjUwLWRldjA0NTUAAAAAAA

Но я хочу, чтобы выглядеть следующим образом:

AAAAPAog4lBVgGJrT2b + mQVicHN3d ///// ///3hhcDJiLWVtMjUwLWVtMjUwLWRldjA0NTUAAAAA..AA

Как вы можете видеть, «..» представляет 0x0D и 0x0A или символ новой строки, которая insterted на 76-й символ (это то, что старый base64 будет выводить).

Однако, когда я добавляю байты b1 и b2 (перевод строки) после 76-го символа, выход становится:

BPwAFHwA0CUFoG8AgDRCAAIlQgAAJUIAAhUfNEIAAiUkmw/0fADQFSInART/ADUlfADQFQE0fADQ ..

Так это выглядит как ".." находится в нужном месте, но все до того, как оно изменилось.

Спасибо!

+0

Как это «изменить весь вывод»? – immibis

+1

'txt.replaceAll (". {76} "," $ 0 \ r \ n ")' – aioobe

ответ

4

Вы хотите getMimeEncoder вместо:

MIME

Использует "алфавита base64", как указано в таблице 1 RFC 2045 для кодирования и декодирования операции. Закодированный вывод должен быть представлен в строках длиной не более 76 символов и использует возврат каретки '\ r', за которым следует сразу linefeed '\ n' в качестве разделителя строк. В конец кодированного вывода не добавлен разделитель строк. Все разделители строк или другие символы, не найденные в таблице алфавита base64, игнорируются при операции декодирования.

(курсив мой)

Следует отметить, что схема кодирования в противном случае такой же, как основной кодер от getEncoder - они оба получены из RFC 2045.

+0

Я попробую, но MIME также меняет такие символы, как '/', и я хочу воссоздать файл, который моя командная строка Base64 программа, которая выводила (у которой есть/'s) Я не уверен, как декодирование C base64, которое я использую, обработает это. –

+0

@EricNelson: кодировка MIME, используемая Java, документирована для использования таблицы 1 RFC 2045, которая является той же таблицей, используемой базовой кодировкой. Он не должен изменять ваш вывод, кроме как добавить несколько строк. – nneonneo

0

Сегодня я расщепляется Base64 представление X509Certificate со следующим кодом:

StringBuilder sb = new StringBuilder(); 
int chunksCount = str.length()/76; 
for(int i=0;i<chunksCount;i++){ 
    sb.append(str.substring(76*i,76*(i+1))).append("\r\n"); 
} 
if(str.length() % 76 != 0) sb.append(str.substring(76*chunksCount)).append("\r\n"); 

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