【问题标题】:Base64 partial encodingBase64 部分编码
【发布时间】:2012-11-19 10:45:52
【问题描述】:

我必须在 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);

有什么问题?是导致问题的分裂吗?

【问题讨论】:

  • 你为什么不做一个测试:1(或 100)个小文件/字节数组,使用 split 和不使用它对其进行编码,解码它们并将两个结果与源进行比较。
  • 我做了测试,比较两个结果我发现它们总是不同的,但在大多数情况下,最终的 zip 不会损坏,但在其他情况下是的,所以我可以'不拆分数组。

标签: split base64 decode encode


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,事实证明是这样,是的,我得到了 OutOfMemoryException,我现在正在考虑使用流来完成这项工作..
【解决方案2】:

base 64 编码读取 3 个字节并将它们转换为 4 个字节,如果文本未与 3/4 因子对齐,则需要添加一个填充,因此当您拆分文件时,编码过程中有 2 个填充,以及您需要做什么才能将其拆分为两半编码之后和之前的进程工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多