能否将文件分块进行base64编码?

25

我正在尝试将一个巨大的输入文件进行base64编码,并以文本输出形式结束,我想知道是否可以逐位对输入文件进行编码,或者是否需要一次性编码整个文件。

如果在AS/400(iSeries)上执行此操作,是否有任何区别。我正在使用自己编写的base64编码程序(用RPG编写),这个程序效果非常好,但是由于大小限制,无法完美运行。

3个回答

45

无法逐位进行转换,但一次可以处理3个字节或3个字节的倍数!

换句话说,如果将输入文件分成大小为3个字节的倍数的“块”,则可以单独编码这些块,并将结果拼接成B64编码后的片段(当然要按照相应的顺序)。注意,最后一个块的大小不一定是3的倍数,其对应的B64值会有一些填充字符(通常是等号),但这没关系,因为这将是唯一需要这样的填充的部分。

解码方向上也是同样的道理,只需将B64编码数据分割成4个字节的倍数。根据需要并行/单独解码它们,并通过将解码后的部分附加在一起(再次按相同的顺序)重新组合原始数据。

示例:

“文件”内容 = "Never argue with the data." (Jimmy Neutron)
直接编码 = Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

现在,按块处理:
"Never argue     -->     Ik5ldmVyIGFyZ3Vl
with the         -->        IHdpdGggdGhl
data." (Jimmy Neutron) --> IGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

当按照这种顺序将3个编码块排列在一起时,它们的总和与为整个文件生成的代码相同。

解码方法类似,可以使用任意大小的块进行解码,只要它们是4字节的倍数即可。没有必要在编码时使用相对应的块大小。(尽管为每个方向(例如300和400)标准化一个单一的大小可能会使事情更加统一且易于管理。)


看,我花了一段时间来深入研究,因为要求使用特定的缓冲区大小(它不是3的倍数)。一旦我恢复正常,我只需更改缓冲区大小。所以,实际上,我很蠢。尽管每个人都用显而易见的方法回答了这个问题“将缓冲区大小设为3的倍数”,但因为你最先回答了,所以你得到了勾选标记。谢谢! - roryhewitt

3

将任何给定的字节流分成块是一项微不足道的工作。

您可以对任何字节块进行base64编码,没有问题。

您面临的问题是,除非您对块放置特定要求(3个字节的倍数),否则base64编码后的块序列将与实际输出不同。

在C#中,这是一种(粗略的)懒惰方法。实际执行被推迟到调用string.Concat之前,因此您可以对分块字符串做任何想做的操作。(如果将其插入到LINQPad中,则会看到输出)

void Main()
{
    var data = "lorum ipsum etc lol this is an example!!";
    var bytes = Encoding.ASCII.GetBytes(data);
    var testFinal = Convert.ToBase64String(bytes);

    var chunkedBytes = bytes.Chunk(3);
    var base64chunks = chunkedBytes.Select(i => Convert.ToBase64String(i.ToArray()));
    var final = string.Concat(base64chunks);

    testFinal.Dump(); //output
    final.Dump(); //output
}
public static class Extensions
{
    public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> list, int chunkSize)
    {
        while(list.Take(1).Count() > 0)
        {
            yield return list.Take(chunkSize);
            list = list.Skip(chunkSize);
        }
    }
}

输出

bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==

2

如果您自己编写了base64转换代码,那么您应该已经注意到一个显而易见的事情:每3个八位字节序列在base64中由4个字符表示。

因此,您可以在每4个字符的倍数处拆分base64数据,并将这些块转换回其原始位。

我不知道AS/400上如何处理字符文件和字节文件,但如果它有这两个概念,这应该非常容易。

  • 文本文件的每行长度是否有限制?
  • 文本文件是面向行的,还是只是字符流?
  • 一个字节有多少位?
  • 字节文件是否在末尾填充,以便只能创建跨越整个磁盘扇区的文件?

如果您可以回答所有这些问题,那么您还剩下什么确切的困难?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接