Декодирование Base64 с использованием кодека Apache Commons не удается на очень большой двоичный файл - PullRequest
3 голосов
/ 28 июля 2011

Я разрабатываю инструмент шифрования, и для нашего формата зашифрованных файлов я использую Base64 для кодирования данных.Я использую кодек Apache Commons для декодирования файлов с помощью Base64InputStream, обернутого вокруг FileInputStream.Это работало как шарм, пока я не проверил это на большом музыкальном файле.По какой-то таинственной причине, когда я делал это, каждый байт после, включая байт 6028, превращался в 0. Код для чтения его в байт []:

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, все в contents равно 0. Однако contents.length составляет около 300 000 байтов.Как вы можете догадаться, это сделало чудеса для моего приложения.У кого-нибудь есть мысли о том, что происходит?

1 Ответ

7 голосов
/ 28 июля 2011

Семантика in.read() состоит не в том, чтобы прочитать ВСЕ байты в предоставленном буфере, а в том, чтобы прочитать столько, сколько «готово», и дать вам знать, сколько это было.

Затем необходимо повторить вызов на in.read() для следующего чанка, следующего и т. Д., Пока не получите -1. ​​

Ваш текущий код просто получает первый блок, а вы отбрасываете размер фрагмента.

...