1

Base64にエンコードされたzipファイルをサーバーからAndroidフォンに取得する必要があります。ファイルが大きいため (~20MB)、以下のコードを使用して、bufferSize=1024*1024 で文字列を取得し、エンコードしてファイルに書き込みます。メソッド android.util.Base64.encode() で bad-base64 エラーが発生します。なんで?

コード:

int bufferSize = 1024 * 1024;
byte[] buffer = new byte[bufferSize];
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
try {
    fileOutputStream = new FileOutputStream(this.path + "/" + this.zipFileName);
    inputStream = connection.getInputStream();
    int bytesRead;
    //read bytes
    while ((bytesRead = inputStream.read(buffer, 0, bufferSize)) > 0) {
        byte[] zipBytes = Base64.decode(buffer, 0, bytesRead, Base64.DEFAULT);
        fileOutputStream.write(zipBytes);
    }
} catch (Exception e) {
e.printStackTrace();
} finally {
    if (fileOutputStream != null) {
        try {
        fileOutputStream.close();
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
    if (inputStream != null) {
        try {
        inputStream.close();
            } catch (Exception e) {
        e.printStackTrace();
        }
    }
}
4

2 に答える 2

2

まず第一に、なぜBase64なのか?通常は、zipファイルを送信してから、クライアントに解凍させます。Base64は1文字あたり6ビットに制限されているため、帯域幅を節約できます。サーバーコードを変更できる場合は、zipファイルをそのまま提供するのが最適です。

とにかく、チャンクごとにファイルを取得したとしても、それらのチャンクを個別にデコードすることはできません。1024* 1024バイトのチャンクをすべてまとめてから、ロットをデコードする必要があります。この操作には20MBのバッファーが必要です。Base64は、各チャンクの最後にいくつかのターミネータ文字を追加します。ウィキペディアの記事にはかなり良い説明があります。

もう1つのオプションは、チャンクサイズを3の倍数にすることです。この場合、Base64の結果はチャンクに分割され、入力と同じになる可能性があると思います。試してみる価値があります。

于 2012-09-11T21:02:16.100 に答える
1

Base64.decode() にブレークポイントを設定し、バッファに何があるかを確認することをお勧めします。ほとんどの場合、予期しないもの (サーバー アプリからのエラーなど) が表示され、デコード エラーが発生します。

于 2012-09-11T20:56:44.750 に答える