Base64编码的字符串能否以3个等号结束?

时间:2017-02-05 13:02:29

标签: c# base64

This post建议(参见Anirudh Ramanathan的回答)Base64编码的字符串最多可以包含3个相等的字符。在网络的其他地方,我看到它可以是一个或两个相同的标志。从理论上讲,由于我们必须将长度设为4的倍数,Anirudh的答案似乎是正确的。哪些信息是错误的?

使用暴力,我试图寻找一个字符串,其Base64最终会有3个等号,但是没有成功找到任何长度最多10,000个字符的字符串。

或者我错过了这里显而易见的事情?

2 个答案:

答案 0 :(得分:3)

不,它不能以3" ="迹象。 base64编码字符串的每4个字符恰好代表3个字节,因为字节包含8位(2 ^ 8),64 = 2 ^ 6。因此base-64编码的4个字符最多可以容纳2 ^ 6 * 2 ^ 6 * 2 ^ 6 * 2 ^ 6位,正好是2 ^ 8 * 2 ^ 8 * 2 ^ 8 = 3字节。因为2 ^ 8> 2 ^ 6,您需要至少两个base-64字符来编码一个字节。由此得出,base-64字符串不能包含3个字符填充:1个字节将用两个字符编码+两个填充" ="字符。 2字节显然也可以要求不超过两个填充字符。 0和3字节根本不需要填充。

答案 1 :(得分:1)

下表显示了三个输入字节如何映射到四个Base64字符。

        1       2       3                
8-bit:  111111112222222233333333
Base64: 111111222222333333444444 
        1     2     3     4                   

这是一个模3输入,是最佳编码方案:没有浪费的位,也不需要填充:输出字符串是四个字符。

现在,当您只想编码两个输入字节时,需要三个输出字符。这意味着输出将填充一个填充字符,直到总共四个字符。

然后,最小的非空输入(一个8位字节)被编码为两个Base64字符。现在需要两个填充字符将输出字符串填充为四个字符。

输出是一个字符没有输入,所以你永远不必使用三个填充字符 - 只要你编码整个8位字节。