我试图对一个巨大的输入文件进行base64编码,最后得到一个文本输出文件,我想知道是否可以对输入文件进行逐位编码,或者是否需要一次对整个文件进行编码。
这将在AS/400 (iSeries)上完成,如果这会有任何不同的话。我正在使用我自己的base64编码例程(用RPG编写),它工作得很好,如果没有大小限制的话,也没问题。
发布于 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)标准化为一种大小可能会使事情更统一,更容易管理。
发布于 2011-10-28 03:08:42
将任何给定的字节流分割成块是一项微不足道的工作。
你可以毫无问题地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==
发布于 2011-10-28 02:55:38
嗯,如果您自己编写了base64转换,您应该已经注意到一件显而易见的事情:在base64中,每个由3个二进制八位数组成的序列由4个字符表示。
因此,您可以以四个字符的倍数拆分base64数据,并且可以将这些块转换回它们的原始位。
我不知道字符文件和字节文件是如何在AS/400上处理的,但如果这两个概念都有的话,这应该很容易。
如果你能回答所有这些问题,你还剩下哪些具体的困难?
https://stackoverflow.com/questions/7920780
复制相似问题