0

バイト配列 (Zipfile のバイト ストリーム) を base64 でエンコードする必要がありますが、配列が大きすぎます。そこで、配列を 2 つの部分に分割し、前半をエンコードしてから後半をエンコードし、最後に 2 番目の部分を最初の部分に追加します。問題は、結果をデコードすると、zipfile が破損しているように見えることがあります。

    FileInputStream fis = new FileInputStream(new File(filePath));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    while((len = fis.read(buffer)) >= 0) {
        baos.write(buffer);
    }

    byte[] bArray = baos.toByteArray();

    int bArrayLength = bArray.length;

    byte[] part1 = new byte[bArray.length / 2];
    byte[] part2 = new byte[ (bArrayLength%2 == 0) ? (bArray.length / 2) : (bArray.length / 2 + 1)];

    System.arraycopy(bArray, 0, part1, 0, part1.length);
    System.arraycopy(bArray, part1.length, part2, 0, part2.length);

    resultArray[0] = Base64.encodeBytes(part1);
    resultArray[1] = Base64.encodeBytes(part2);

何が問題ですか?問題の原因はその分割ですか?

4

2 に答える 2

0

Base 64エンコーディングは3バイトを読み取り、それらを4バイトに変換します。テキストが3/4ファクターに揃えられていない場合は、追加するパッドがあるため、ファイルを分割すると、エンコーディングプロセスからのパッドが2つあります。パッドが半分ごとに終了する場所を正確に2つに分割し、4バイトの読み取り/ 3バイトの出力係数に基づいてデコードしてから、もう一度連結する必要があるため、前後の半分ごとのサイズを考慮する必要があります。プロセスが機能するためのエンコーディング

于 2012-11-19T10:51:35.817 に答える
0

パディングが原因で、これはおそらく機能しません。Base64アルゴリズムは、エンコードの結果が1バイトのみを含む(24ビットの)末尾グループになる場合は==で、出力が2バイトのみを含む場合は=で出力をパディングします。つまり、2つのエンコードされた文字列を足し合わせて、正しい結果が得られると期待することはできません。

しかし、配列が大きすぎることをどうやって知ることができますか?OutOfMemoryExceptionが発生しますか?

中間点で正確に分割しようとしない場合がありますが、その部分の末尾の=が得られなくなるまで、別の点を選択してください。

http://en.wikipedia.org/wiki/Base64も参照してください。

于 2012-11-19T10:52:13.570 に答える