为什么一个base64编码的string在末尾有一个=符号

我知道什么是base64编码,以及如何在C#中计算base64编码,但是我已经多次看到,当我将一个string转换为base64时,最后是一个=

有几个问题出现了:

  1. base64string总是以=结尾吗?
  2. 为什么最后会附加一个=

它用作填充 。

更完整的答案是,base64编码的string并不总是以a结尾,如果需要将string填充到合适的长度,它将只以一个或两个=结尾。

维基百科 :

'=='和'='序列表示最后一个组只包含8位或16位。

因此,这是某种填充。

作为一个简短的回答:第65个字符(“=”符号)仅在编码消息的最后过程中用作补充。

如果您的string具有3个字符数的倍数,则不会有'='符号。 因为Base64编码需要三个字节(8位),并将它们表示为ASCII标准中的四个可打印字符。

细节 :

(a)如果你想编码…

ABCDEFG <=> [ ABC ] [ DEF ] [ G

Base64将处理第一个块和第二个,但第三个将在输出中添加一个double ==以完成4个需要的字符。结果将是QUJD REVG Rw == (无空格)

(b)如果你想编码…

ABCDEFGH <=> [ ABC ] [ DEF ] [ GH

它将在输出结尾添加一个单一的= 4个字符,结果将是QUJD REVG R0g = (无空格)

如果在编码数据的末尾有less于24位可用,则其在RFC 2045中定义为特殊的填充字符。

等号(=)用作某种forms的base64编码的填充。 维基百科关于base64的文章包含了所有的细节。

  1. 没有。
  2. 要将Base64编码的string填充到长度为4个字符的倍数,以便可以正确解码。

这是填充。 从http://en.wikipedia.org/wiki/Base64

理论上,填充字符不需要解码,因为丢失字节的数量可以从Base64数字的个数计算出来。 在一些实现中,填充字符是必需的,而对于其他的则不使用。 其中需要填充字符的一种情况是连接多个Base64编码文件。

http://www.hcidata.info/base64.htm

编码“玛丽有”到基地64

在这个例子中,我们使用一个简单的文本string(“Mary had”),但是不pipe数据是什么(例如graphics文件),该原则都是可以的。 为了将每24位input数据转换为32位输出,Base 64编码将24位分成4个6位块。 我们注意到的第一个问题是“玛丽有”不是3个字节的倍数 – 它是8个字节长。 因此,最后一组比特只有4比特长。 为了解决这个问题,我们添加两个额外的'0'位,并在末尾加上'='来记住这个事实。 如果要转换为Base 64的文本string长度为7个字节,则最后一个组将具有2个比特。 在这种情况下,我们会添加4个额外的'0'位,并在末尾加上'=='来记住这个事实。