Base64编码的字符串可以以3个等号结尾吗?
Can Base64 encoded string end with 3 equal signs?
This post 建议(参见 Anirudh Ramanathan 的回答)Base64 编码的字符串最多可以包含 3 个相等的字符。在网络的其他地方,我看到它可以是一个或两个等号。从理论上讲,由于我们必须使长度成为 4 的倍数,因此 Anirudh 的答案似乎是正确的。以下哪条信息是错误的?
我尝试使用暴力查找一个字符串,其 Base64 将以 3 个等号结尾,但没有成功找到任何长度不超过 10,000 个字符的字符串。
还是我漏掉了明显的东西?
不可以,它不能以 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字节根本不需要填充
下面的 table 显示了三个输入字节如何映射到四个 Base64 字符。
1 2 3
8-bit: 111111112222222233333333
Base64: 111111222222333333444444
1 2 3 4
这个模 3 输入是最佳编码方案:没有比特浪费,也不需要填充:输出字符串是四个字符。
现在当你只想对两个输入字节进行编码时,你需要三个输出字符。这意味着输出会用一个填充字符填充,直到总共四个字符。
然后最小 non-empty 输入,即一个 8 位字节,被编码为两个 Base64 字符。现在需要两个填充字符来将输出字符串填充为四个字符。
没有一个输出是一个字符的输入,因此您永远不必使用三个填充字符 - 只要您对整个 8 位字节进行编码。
This post 建议(参见 Anirudh Ramanathan 的回答)Base64 编码的字符串最多可以包含 3 个相等的字符。在网络的其他地方,我看到它可以是一个或两个等号。从理论上讲,由于我们必须使长度成为 4 的倍数,因此 Anirudh 的答案似乎是正确的。以下哪条信息是错误的?
我尝试使用暴力查找一个字符串,其 Base64 将以 3 个等号结尾,但没有成功找到任何长度不超过 10,000 个字符的字符串。
还是我漏掉了明显的东西?
不可以,它不能以 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字节根本不需要填充
下面的 table 显示了三个输入字节如何映射到四个 Base64 字符。
1 2 3
8-bit: 111111112222222233333333
Base64: 111111222222333333444444
1 2 3 4
这个模 3 输入是最佳编码方案:没有比特浪费,也不需要填充:输出字符串是四个字符。
现在当你只想对两个输入字节进行编码时,你需要三个输出字符。这意味着输出会用一个填充字符填充,直到总共四个字符。
然后最小 non-empty 输入,即一个 8 位字节,被编码为两个 Base64 字符。现在需要两个填充字符来将输出字符串填充为四个字符。
没有一个输出是一个字符的输入,因此您永远不必使用三个填充字符 - 只要您对整个 8 位字节进行编码。