0

我必须在 base64 中编码一个字节数组(即 Zipfile 的字节流),但数组太大。所以我把数组分成两部分,编码前半部分,然后编码第二部分,最后我将第二部分附加到第一部分。问题是,有时当我解码结果时,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 个填充,以及您需要将其拆分为两半,正好在焊盘完成的位置根据 4 字节读取/3 字节输出因子解码它们,然后再次连接它们,因此您需要考虑前后每半的大小进程工作的编码

于 2012-11-19T10:51:35.817 回答
0

由于padding,这可能不起作用。如果 Base64 算法的编码导致尾组(24 位)仅包含 1 个字节,则 Base64 算法用 == 填充其输出,或者如果仅包含 2 个字节,则使用 = 填充其输出。这意味着您不能只是将两个编码字符串相加并期望得到正确的结果。

但是你怎么知道数组太大了——你会得到 OutOfMemoryException 吗?

您可能会尝试不完全在中间点拆分,而是选择一个不同的点,直到您不再获得该部分的尾随 =。

另见http://en.wikipedia.org/wiki/Base64

于 2012-11-19T10:52:13.570 回答