This post建议(参见Anirudh Ramanathan的回答)Base64编码的字符串最多可以包含3个相等的字符。在网络的其他地方,我看到它可以是一个或两个等号。从理论上讲,由于我们必须将长度定为4的倍数,Anirudh的答案似乎是正确的。哪些信息是错误的?Base64编码的字符串可以以3个等号结尾吗?
使用蛮力,我试图寻找一个字符串的Base64将结束3等号,但没有找到任何字符串长达10,000个字符的成功。
还是我错过了这里的明显?
This post建议(参见Anirudh Ramanathan的回答)Base64编码的字符串最多可以包含3个相等的字符。在网络的其他地方,我看到它可以是一个或两个等号。从理论上讲,由于我们必须将长度定为4的倍数,Anirudh的答案似乎是正确的。哪些信息是错误的?Base64编码的字符串可以以3个等号结尾吗?
使用蛮力,我试图寻找一个字符串的Base64将结束3等号,但没有找到任何字符串长达10,000个字符的成功。
还是我错过了这里的明显?
下表显示三个输入字节如何映射到四个Base64字符。
1 2 3
8-bit: 111111112222222233333333
Base64: 111111222222333333444444
1 2 3 4
此,模3的输入,是最佳的编码场景:没有浪费位,并且不需要填充:输出字符串是四个字符。
现在,当您只想编码两个输入字节时,需要三个输出字符。这意味着输出将被填充一个填充字符,直到总共四个字符。
然后,最小的非空输入(一个8位字节)被编码为两个Base64字符。现在需要两个填充字符来将输出字符串填充为四个字符。
没有输入是其中一个字符的输出,因此您不必使用三个填充字符 - 只要您编码的是整个8位字节。
不,它不能以3“=”号结尾。由于字节包含8位(2^8),并且64 = 2^6,所以base64编码字符串的每4个字符恰好代表3个字节。因此base-64编码的4个字符最多可以容纳2^6 * 2^6 * 2^6 * 2^6位,这正好是2^8 * 2^8 * 2^8 = 3个字节。因为2^8> 2^6,所以至少需要两个基本的64个字符来编码一个字节。由此可见,base-64字符串不能包含3个字符padding:1个字节将用两个字符+两个填充“=”字符编码。显然,2个字节不能超过两个填充字符。 0和3个字节根本不需要填充。
谢谢。挺好的。 – dotNET
这是不正确的。他基于这个猜测,要求字符串的长度必须是4的倍数,因此假定需要多达3个填充字符。他没有意识到的是base64在填充之前总是会产生偶数个字符。所以最多需要2个填充字符。请注意FromBase64String [有错误](http://stackoverflow.com/a/21203467/17034)。 –
我编辑它之前链接的答案在这里http://stackoverflow.com/revisions/6309439/2 – Slai