我知道base64编码是什么,以及如何计算c中的base64编码,但是我已经见过好几次了,当我将一个字符串转换成base64时,末尾有一个=。
出现了几个问题:
base64字符串是否总是以=结尾?
为什么一个=会在末尾附加?
- 这与C毫无关系。
- 实际上,它与C相关,并不是所有语言都包含=,例如,许多Perl库省略了=,因此了解用户使用的环境实际上是相关的。
- 似乎这使得它在某些情况下变得不那么有效,因为它是可以检测到的。
- @用户1167442 base64不用于混淆。它用于将二进制数据(或具有Unicode和其他特殊字符的字符串)作为字符串进行传输。
它起填充作用。
一个更完整的答案是,base64编码的字符串并不总是以=结尾,如果需要将字符串填充到适当的长度,它只以一个或两个=结尾。
- "需要填充字符的一种情况是连接多个base64编码的文件。"
- @安德&233;普尔:再同步一个单一的=就足够了。如果您想找到边界,那么终结者应该始终存在(并且仍然只需要一个字符)。base64的整个填充概念只是一个脑残…
- 不过,这个链接与base64完全无关。
1-NO
2-简而言之:第65个字符("="号)仅在对消息进行编码的最后一个过程中用作补码。
如果字符串的数字是3个字符的倍数,则不会有"="符号,因为Base64编码每三个字节(8位),在ASCII标准中将它们表示为4个可打印字符。
细节:
(a)如果你想编码
abcdefg<=>[ABC〔DEF〔G。
Base64将处理(产生4个字符)第一个块和第二个块(完成时),但第三个块将在输出中添加一个双==以完成所需的4个字符,因此结果将为qujd revg rw==(无空格)
(b)如果你想编码…
abcdefgh<=>[ABC〔DEF〔GH。
同样,它只会在输出的末尾添加一个=,以获得4个字符。结果将为qujd revg r0g=(无空格)
- 这比其他答案,甚至是维基百科都更完整和清晰,应该比公认的答案更值得投票,因为这个答案只指向维基百科链接。祝你好运!恭喜!
- 解释得很好
维基百科:
The final '==' sequence indicates that the last group contained only one byte, and '=' indicates that it contained two bytes.
因此,这是某种填充。
不。
将base64编码的字符串填充为4个字符的倍数,以便正确解码。
- 我在最后取下了=,测试了100万串。解码总是匹配的。
它在RFC2045中定义为一个特殊的填充字符,如果编码数据末尾的可用位少于24位。
等号(=)在某些形式的base64编码中用作填充。关于base64的维基百科文章包含了所有的细节。
- 你能解释一下为什么"="是1字节"="是2字节的逻辑吗?我就是不明白。为什么输入:"任何肉体的愉悦。"可以得到结果"yw55ignhcm5hbcbvhc3vyzs4=",而"任何肉体的愉悦"可以得到结果"yw55ignhcm5hbcbvhc3vyzq="?
- 不是这样的情况,'=='是1字节,'='是2字节。在这种情况下,您需要在整个字符串中始终有4个字节的倍数。所以你用"="符号填充直到你得到它。第一个字符串比第二个字符串多一个字符,因此需要少加一个"="填充字符。
网址:http://www.hcidata.info/base64.htm
将"mary had"编码为基64
在本例中,我们使用的是一个简单的文本字符串("mary had"),但无论数据是什么(例如图形文件),原则都适用。要将输入数据的每24位转换为输出数据的32位,Base 64编码将24位分成4个6位的块。我们注意到的第一个问题是"mary had"不是3个字节的倍数——它是8个字节长。因此,最后一组位只有4位长。为了解决这个问题,我们添加了两个额外的"0"位,并在末尾加上"="来记住这个事实。如果要转换为base64的文本字符串是7个字节长,那么最后一个组将有2个位。在这种情况下,我们将添加4个额外的"0"位,并通过在末尾加"=="来记住这一事实。
这是填充物。从http://en.wikipedia.org/wiki/base64:
In theory, the padding character is not needed for decoding, since the
number of missing bytes can be calculated from the number of Base64
digits. In some implementations, the padding character is mandatory,
while for others it is not used. One case in which padding characters
are required is concatenating multiple Base64 encoded files.
- 关于"需要填充字符的一种情况是连接多个base64编码的文件"的部分是错误的。例如,当连接两个base64文件时,每个文件的源字节长度为3个字节,base64字符串的长度将为4个字符,并且没有填充字节。当您连接这两个base64字符串时,将无法根据连接的字符串判断一个字符串从何处开始,一个字符串从何处停止。因此,依靠base64填充来帮助实现这一点是行不通的。对于字节长度可以被3整除的任何文件,都会存在这个问题。
- 我猜这意味着最终结果应该是输入的串联。例如,decode(encode(A)+encode(B))=A+B使用填充物,但不使用填充物。
- 也许,但是这种有限的使用不允许在编码字符串连接在一起时,使用填充字符来分隔编码字符串的一般情况。我提到它只是为了帮助那些认为自己可以这样使用它的开发人员。
- 我认为你的反对意见实际上只是强调了填充和定界概念之间的区别。连接的结果一般不会包含足够的信息使其可逆。你不会知道"c3dp enpszxjz"最初是"c3dpenps"+"zxjz"还是"c3dp"+"enpszxjz"。但你也不知道"水枪"最初是"水枪"+"水枪"还是"水枪"+"水枪"。
- 从相关的base64填充回答中复制我的注释:>base64串联[与'='填充]允许编码器并行处理大的块,而无需将块大小调整为三的倍数。类似地,作为一个实现细节,可能有一个编码器需要刷新一个大小不是3的倍数的内部数据缓冲区。