Получение недопустимых данных при декодировании с использованием библиотеки общих кодеков appache

#java #ssl #encode #pkcs#12

#java #ssl #кодировать #pkcs #12

Вопрос:

У меня есть сценарий, в котором я получаю содержимое сертификата pkcs12 в виде закодированной строки (библиотека общих кодеков appache). Теперь я должен декодировать эту строку и сохранить ее в файле. Но при декодировании его как строки я получаю недопустимое содержимое сертификата.

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

Для кодирования:

 Base64.encodeBase64String(certcontentInBytes[])
  

Для декодирования:

 new String(Base64.decodeBase64(certstringContent));
  

Комментарии:

1. Привет всем, после нескольких отладок я узнал, что кодирование и декодирование base64 в appache использует формат iso_8859_1, но при моем преобразовании X509Certificate я использовал UTF-8, что вызывает проблему. При изменении evryting как iso_8859_1 он работает нормально

Ответ №1:

new String(bytes) на самом деле new String(bytes, defaultCharset) преобразует байты, используя кодировку байтов, в строку Unicode. Непереносимая и, вероятно, неправильная кодировка.

Для байтов в виде двоичных данных это не сработает. Строка не должна использоваться для двоичных данных. Бьюсь об заклад, байты были записаны в файл.

Комментарии:

1. да, при декодировании и записи в файл с декодированными байтами он работает хорошо. Но когда я пытаюсь преобразовать его в строку, он выдает недопустимую строку.

Ответ №2:

Возможно, вам нужно использовать new String(byte[], Charset charset) правильную кодировку (вероятно, UTF-8), потому что в противном случае он будет использовать кодировку платформы, которая отличается между Windows и Linux / Unix. Интересно, почему вы не можете просто использовать массив байтов в качестве параметра?

Комментарии:

1. спасибо за ответ. Я даже пытался использовать эти возможности.

2. Не зная вашего кода: сохранение байтов в файл и последующее использование этого файла работает, но преобразование байтов в строку, и эта строка не работает — звучит почти так, как будто код, который вы используете, обрабатывает файлы и строки по-разному. Я настоятельно рекомендую вам обернуть свои байты в an ByteArrayInputStream и использовать их в качестве замены a FileInputStream , которая (скорее всего) стоит за использованием файла.