web-dev-qa-db-ja.com

org.Apache.commons.codec.binary.base64を使用してJavaオブジェクトをBase64エンコードする方法は?

私はオブジェクトのシリアル化を試みており、結果をBase64でエンコードしています。 Sunのlibで動作します。

_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()));

Apacheのエンコーダーを使用してbyteArrayの正しいBase64エンコーディングを実現する正しい方法は何でしょうか?

14
Ta Sas

実際、_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
_
24
QuantumMechanic

commons-codecホームページ から:

コーデックは、Base64エンコーダーの1つの最終的な実装に開発努力を集中させる試みとして形成されました。コーデックの提案の時点で、約34の異なるJavaを処理するクラスが、財団のCVSリポジトリに広がりました。ジャカルタTomcatプロジェクトの開発者は、オリジナルバージョンのBase64コーデックを実装していましたこれはCommons HttpClientおよびApache XMLプロジェクトのXML-RPCサブプロジェクトによってコピーされたものです。ほぼ1年後、2つの分岐したバージョンのBase64が大幅に分岐しました。XML-RPCには、 Commons HttpClient Base64。サブプロジェクトごとに、RFC 2045への準拠のさまざまなレベルで実装が異なりました。

あなたの問題は、コンプライアンスの「さまざまなレベル」だと思います。

私のアドバイス:1つのbase64エンコーダー/デコーダーを選択し、それに固執する

2
user180100