我正在尝试将一个巨大的输入文件进行base64编码,并以文本输出形式结束,我想知道是否可以逐位对输入文件进行编码,或者是否需要一次性编码整个文件。
如果在AS/400(iSeries)上执行此操作,是否有任何区别。我正在使用自己编写的base64编码程序(用RPG编写),这个程序效果非常好,但是由于大小限制,无法完美运行。
我正在尝试将一个巨大的输入文件进行base64编码,并以文本输出形式结束,我想知道是否可以逐位对输入文件进行编码,或者是否需要一次性编码整个文件。
如果在AS/400(iSeries)上执行此操作,是否有任何区别。我正在使用自己编写的base64编码程序(用RPG编写),这个程序效果非常好,但是由于大小限制,无法完美运行。
无法逐位进行转换,但一次可以处理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)标准化一个单一的大小可能会使事情更加统一且易于管理。)
将任何给定的字节流分成块是一项微不足道的工作。
您可以对任何字节块进行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==
如果您自己编写了base64转换代码,那么您应该已经注意到一个显而易见的事情:每3个八位字节序列在base64中由4个字符表示。
因此,您可以在每4个字符的倍数处拆分base64数据,并将这些块转换回其原始位。
我不知道AS/400上如何处理字符文件和字节文件,但如果它有这两个概念,这应该非常容易。
如果您可以回答所有这些问题,那么您还剩下什么确切的困难?