在这里提出了类似的问题:Is base64 encoding always one to one
显然,(类似问题的答案)是。我已经知道了,但是我很想知道为什么这两个字符串在经过Base64解码后看起来是等效的解释:
cwB0AGQAAG ==
cwB0AGQAAA ==
还有一件事情……当您选择已解码的字符串然后重新编码时,两者都重新编码为相同的值:cwB0AGQAAA ==
发生了什么事?
答案 0 :(得分:3)
base64不是一对一的;编码相同字节有多种方法。您会看到多种编码字符串末尾填充的方法。
base64将字节(每个8位)编码为base64。base64中的一个字符编码6位,因此每三个字符可以处理3个字节。当输入的长度不是三的倍数时,base64使用=
作为填充字符。 XXX=
指示仅使用组的前两个字节(其中XXX
代表三个任意的base64字符),而XX==
指示仅应使用第一个字节。 / p>
示例中的最后一组是AA==
,它编码为0字节。但是,AA
部分可以编码12位,其中最低有效四位在解码时被忽略,因此您可以使用A-P
中的任何字符并获得相同的结果。使用编码器时,它始终会为这四个位选择零,因此您会返回AA==
。
在base64中,填充实际上甚至更加复杂。从技术上讲,您可以排除=
个字符;字符串的长度将指示它们的缺失(根据Wikipedia,并非所有解码器都支持)。填充有用的地方是,它允许安全地连接base64字符串,因为每四个一组的解释方式相同。但是,这意味着填充也可以出现在字符串的中间,这意味着可以以各种方式对字节序列进行编码。您还可以包含空格或换行符,这些空格或换行符都会被忽略。
尽管所有这些,base64仍然是内射的,这意味着如果x!= y,则base64(x)!= base64(y);结果,您不会发生冲突,并且始终可以获取原始数据。但是,base64并不是唯一的:编码相同数据的方法有很多。