3

我正在开发一个加密工具,对于我们的加密文件格式,我使用 Base64 对数据进行编码。我正在使用 apache commons 编解码器使用围绕 FileInputStream 的 Base64InputStream 解码文件。这就像一个魅力,直到我在一个大的音乐文件上测试它。出于某种神秘的原因,当我这样做时,包括字节 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 之后,所有内容contents都是 0。但是,contents.length大约是 300,000 字节。您可以猜到,这对我的应用程序产生了奇迹。有没有人知道发生了什么?

4

1 回答 1

7

的语义in.read()不是读取提供的缓冲区中的所有字节,而是读取尽可能多的“准备就绪”并让您知道那是多少。

然后,您必须重复对in.read()下一个块和下一个等的调用,直到您得到 -1。

您当前的代码仅获取第一个块,而您丢弃了块的大小。

于 2011-07-27T22:24:12.767 回答