首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以将文件分块进行Base64编码?

是否可以将文件分块进行Base64编码?
EN

Stack Overflow用户
提问于 2011-10-28 02:46:50
回答 3查看 21.6K关注 0票数 21

我试图对一个巨大的输入文件进行base64编码,最后得到一个文本输出文件,我想知道是否可以对输入文件进行逐位编码,或者是否需要一次对整个文件进行编码。

这将在AS/400 (iSeries)上完成,如果这会有任何不同的话。我正在使用我自己的base64编码例程(用RPG编写),它工作得很好,如果没有大小限制的话,也没问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-28 02:51:02

这是不可能的逐位,但一次3个字节,或倍数3个字节的时间可以做

换句话说,如果你把你的输入文件分成大小是3字节的倍数的“块”,你可以分别对这些块进行编码,然后把得到的B64编码的块拼凑在一起(当然是按照相应的顺序)。请注意,最后一个chuink的大小不需要恰好是3字节的倍数,这取决于其大小的模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)标准化为一种大小可能会使事情更统一,更容易管理。

票数 39
EN

Stack Overflow用户

发布于 2011-10-28 03:08:42

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

你可以毫无问题地base64任何字节块。

您面临的问题是,除非您对数据块(3字节的倍数)提出特定要求,否则Base64编码的数据块序列将不同于您想要的实际输出。

在C#中,这是一种(草率的)方式,你可以懒惰地做它。实际上,执行被推迟到调用string.Concat,所以您可以对分块的字符串做任何您想做的事情。(如果您将此代码插入到LINQPad中,您将看到输出)

代码语言:javascript
运行
复制
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);
        }
    }
}

输出

代码语言:javascript
运行
复制
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
票数 3
EN

Stack Overflow用户

发布于 2011-10-28 02:55:38

嗯,如果您自己编写了base64转换,您应该已经注意到一件显而易见的事情:在base64中,每个由3个二进制八位数组成的序列由4个字符表示。

因此,您可以以四个字符的倍数拆分base64数据,并且可以将这些块转换回它们的原始位。

我不知道字符文件和字节文件是如何在AS/400上处理的,但如果这两个概念都有的话,这应该很容易。

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

如果你能回答所有这些问题,你还剩下哪些具体的困难?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7920780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档