Base64编码的字符串可以以3个等号结尾吗?

dot*_*NET 6 c# base64

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

使用蛮力,我尝试寻找一个 Base64 会以 3 个等号结尾的字符串,但没有成功找到任何长度最多为 10,000 个字符的字符串。

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

Cod*_*ter 7

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

        1       2       3                
8-bit:  111111112222222233333333
Base64: 111111222222333333444444 
        1     2     3     4                   
Run Code Online (Sandbox Code Playgroud)

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

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

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

没有任何输入的输出是一个字符,因此只要您对整个 8 位字节进行编码,就永远不需要使用三个填充字符。


Evk*_*Evk 6

不可以,不能以 3 个“=”符号结尾。Base64 编码字符串的每 4 个字符正好代表 3 个字节,因为字节包含 8 位(2^8),并且 64 = 2^6。所以4个base-64编码的字符最多可以容纳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 字节根本不需要填充。