Вопрос по java, encoding – Как Base64 кодировать объект Java с помощью org.apache.commons.codec.binary.base64?

13

Я пытался выполнить сериализацию объекта, и Base64 закодировал результат. Он работает с библиотекой Sun:

Bean01 bean01 = new Bean01();
bean01.setDefaultValues();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream( baos ).writeObject( bean01 );
System.out.println(Base64.encode(baos.toByteArray()));

Это отлично работает. Однако я хотел бы сделать то же самое с помощью org.apache.commons.codec.binary.base64, но это не возвращает ту же строку:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

Каков будет правильный способ достижения правильной кодировки Base64 массива byteArray с использованием кодера Apache?

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 Ta Sas
КоторыйBase64 Класс в "Sun" lib " вы используете в своем первом примере? QuantumMechanic

Ваш Ответ

2   ответа
23

На самом делеcommons-codec версия и конкретная внутренняя версия Sun, которую вы используетеdo дать те же результаты. Я думаю, что вы думали, что они давали разные версии, потому что вы неявно звонитеtoString() в массиве, когда вы делаете:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

который определенно не распечатывает содержимое массива. Вместо этого это только распечатает адрес ссылки на массив.

Я написал следующую программу для проверки кодеров друг против друга. Из приведенного ниже вывода вы увидите, что они дают такие же результаты:

import java.util.Random;

public class Base64Stuff
{
    public static void main(String[] args) {
        Random random = new Random();
        byte[] randomBytes = new byte[32];
        random.nextBytes(randomBytes);

        String internalVersion = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(randomBytes);
        byte[] apacheBytes =  org.apache.commons.codec.binary.Base64.encodeBase64(randomBytes);
        String fromApacheBytes = new String(apacheBytes);

        System.out.println("Internal length = " + internalVersion.length());
        System.out.println("Apache bytes len= " + fromApacheBytes.length());
        System.out.println("Internal version = |" + internalVersion + "|");
        System.out.println("Apache bytes     = |" + fromApacheBytes + "|");
        System.out.println("internal equal apache bytes?: " + internalVersion.equals(fromApacheBytes));
    }
}

И вот результат его работы:

Internal length = 44
Apache bytes len= 44
Internal version = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
Apache bytes     = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
internal equal apache bytes?: true
Error: User Rate Limit Exceeded Ta Sas
2

Отобщая страница кодека:

Codec was formed as an attempt to focus development effort on one definitive implementation of the Base64 encoder. At the time of Codec's proposal, there were approximately 34 different Java classes that dealt with Base64 encoding spread over the Foundation's CVS repository. Developers in the Jakarta Tomcat project had implemented an original version of the Base64 codec which had been copied by the Commons HttpClient and Apache XML project's XML-RPC subproject. After almost one year, the two forked versions of Base64 had significantly diverged from one another. XML-RPC had applied numerous fixes and patches which were not applied to the Commons HttpClient Base64. Different subprojects had differing implementations at various levels of compliance with the RFC 2045.

Я думаю, что ваша проблема заключается в «различном уровне» соответствия.

Мой совет: выберите один кодер / декодер base64 и придерживайтесь его

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededexceptError: User Rate Limit Exceededtechiegyan.com/2009/01/11/…Error: User Rate Limit Exceeded Ta Sas

Похожие вопросы