3

私は暗号化ツールを開発しており、暗号化されたファイル形式では Base64 を使用してデータをエンコードしています。FileInputStream にラップされた Base64InputStream を使用してファイルをデコードするために、apache commons コーデックを使用しています。大きな音楽ファイルでテストするまで、これは魅力的に機能しました。不思議な理由で、これを行ったとき、バイト 6028 以降のすべてのバイトが 0 になりました。それを byte[] に読み込むコードは次のとおりです。

FileInputStream filein = new FileInputStream(filename);
Base64InputStream in = new Base64InputStream(filein,false,76,'\n');
byte[] contents = new byte[known_and_tested_correct_filelength];
in.read(contents);

なんらかの理由で、バイト 6028 以降はすべてcontents0 です。ただし、contents.length約 300,000 バイトです。ご想像のとおり、これは私のアプリケーションにとって驚異的でした。誰かが何が起こっているのかについて少しでも知っていますか?

4

1 に答える 1

7

のセマンティクスはin.read()、提供されたバッファ内のすべてのバイトを読み取るのではなく、「準備ができている」数だけ読み取り、それがいくつあったかを知らせることです。

in.read()-1 を取得するまで、次のチャンクと次のチャンクなどの呼び出しを繰り返す必要があります。

現在のコードは最初のチャンクを取得するだけで、チャンクのサイズを破棄します。

于 2011-07-27T22:24:12.767 に答える