为什么base64编码的字符串最后有一个=符号

san*_*ngh 298 base64 encoding

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

提出了几个问题:

  1. 难道一个base64字符串总是以结束=
  2. 为什么=最后会附加?

Bad*_*laj 253

1,无

2-简而言之:第65个字符("="符号)仅用作编码消息的最后过程的补充.

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

细节 :

(a)如果你想编码

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

Base64将处理(产生4个字符)第一个块和第二个(因为它们是完整的)但是对于第三个,它将==在输出中添加一个double 以完成所需的4个字符.因此,结果将是 QUJD REVG Rw == (没有空格)

(b)如果你想编码......

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

同样,它只会=在输出结尾添加一个单词 来获得4个字符,结果将是 QUJD REVG R0g = (没有空格)

  • 这比其他答案甚至维基百科更加完整和清晰,并且应该得到比接受的答案更多的选票,这些答案除了指向维基百科链接之外什么都不做.感谢你!Upvoted! (21认同)
  • @ANewGuyInTown接受的解决方案中的Wikipedia链接不正确,与base64上的填充无关。[正确的页面](https://en.wikipedia.org/wiki/Base64#Output_padding)由Legolas在他的[下面的答案]中链接(/sf/answers/484179181/) (2认同)

And*_*are 251

它用作填充物.

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

  • 但是,该链接与base64完全无关. (4认同)
  • @Fr0zenFyr 如果你想要一个链接,https://en.wikipedia.org/wiki/Base64#Output_padding 非常好。但[Badr的回答](/sf/answers/2559978221/)确实是一个更好的答案(它只是还没有赶上投票)。 (4认同)
  • @AndréPuel:重新同步一个“=”就足够了。如果你想找到边界,那么终止符应该始终存在(并且仍然只需要一个字符)。Base64 的整个填充概念只是一个脑残...... (3认同)
  • “需要填充字符的一种情况是串联多个Base64编码的文件。” (2认同)
  • 我只是希望发布一个相关且可靠的链接,通过插图和示例有效地解释“base64”中的填充。目前指向维基百科的链接与@NH 一样完全不相关。提及。 (2认同)

小智 66

来自维基百科:

最后的'=='序列表示最后一个组只包含一个字节,'='表示它包含两个字节.

因此,这是某种填充.


Ian*_*emp 16

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

  • 我删除了最后的 `=` 并测试了 100 万个字符串。解码始终匹配。 (3认同)

ian*_*lly 15

如果编码数据末尾少于24位,则在RFC 2045中将其定义为特殊填充字符.


Sam*_*way 11

等号(=)用作某些形式的base64编码中的填充.关于base64 的维基百科文章包含所有细节.

  • 不是'=='是1个字节而'='是2个字节的情况.在整个字符串中,您需要始终拥有4个字节的倍数.所以你用'='标志填充,直到你得到它.第一个字符串比第二个字符串多一个字符,因此需要少一个'='的填充. (13认同)
  • 这个答案应该是评论吗? (3认同)
  • 你能解释为什么"=="是1个字节而"="是2个字节的逻辑?我只是无法理解.怎么来输入:"任何属肉体的快乐." 可以得到结果"YW55IGNhcm5hbCBwbGVhc3VyZS4 =",而"任何肉体的快乐"可以得到结果"YW55IGNhcm5hbCBwbGVhc3VyZQ =="? (2认同)

Tho*_*ard 8

它是填充物.来自http://en.wikipedia.org/wiki/Base64:

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

  • 关于“需要填充字符的一种情况是连接多个Base64编码文件”的部分。是错的。例如,当连接两个 base64 文件时,其中每个文件的源字节长度为 3 个字节,base64 字符串长度为 4 个字符,并且没有填充字节。当您连接这两个 base64 字符串时,将无法根据连接的字符串来判断一个从哪里开始和一个在哪里停止。因此,依靠 base64 填充来帮助解决此问题是行不通的。对于字节长度可被 3 整除的任何文件,都将存在此问题。 (2认同)

小智 7

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

编码"玛丽有"到Base 64

在这个例子中,我们使用一个简单的文本字符串("玛丽有"),但无论数据是什么(例如图形文件),原则都保持不变.为了将每24位输入数据转换为32位输出,Base 64编码将24位分成4个6位的块.我们注意到的第一个问题是"Mary have"不是3个字节的倍数 - 它是8个字节长.因此,最后一组位只有4位长.为了解决这个问题,我们添加了两个额外的'0'位,并通过在末尾添加'='来记住这一事实.如果要转换为Base 64的文本字符串长度为7个字节,则最后一个组将具有2个位.在这种情况下,我们会添加四个额外的'0'位,并通过在结尾放置'=='来记住这一事实.


Vla*_*yev 5

=是一个填充字符。如果输入流的长度不是 3 的倍数,则会添加填充字符。这是解码器所要求的:如果不存在填充,则最后一个字节将具有错误数量的零位。

这里有更好更深入的解释:https://base64tool.com/detect-whether-provided-string-is-base64-or-not/

  • 扩展一下,虽然标准 base64 指定了填充,但这并不是因为没有它就无法解码。可以制作一个base64实现,其解码器不需要填充,并且解码器仍然可以从字符串末尾的位置获取所有相同的信息。填充具有以下额外好处:1)base64 字符串的长度都是 4 个字符的倍数,这可以简化解码器设计,2)您可以连接两个 Base64 字符串而无需重新编码,并且在中断处有足够的信息正确地恢复同步。 (2认同)