你的结论是正确的,无需填充。始终可以通过编码序列的长度明确地确定输入的长度。
但是,在某些情况下,填充是有用的,例如在拼接base64编码字符串并且单个序列的长度丢失的情况下,就可能发生这种情况,例如在非常简单的网络协议中。
如果连接未填充的字符串,则无法恢复原始数据,因为关于每个单独序列末尾奇数字节数量的信息会丢失。但是,如果使用填充序列,则没有歧义,并且整个序列可以被正确解码。
假设我们有一个程序,对单词进行base64编码,将它们拼接在一起并通过网络发送它们。 它将"I"、"AM"和"TJM"编码,将结果夹在一起,不填充并传输它们。
I
编码为SQ
(SQ==
带填充)AM
编码为QU0
(QU0=
带填充)TJM
编码为VEpN
(VEpN
带填充)因此,传输的数据为SQQU0VEpN
。 接收方通过base64对其进行解码,实际输出为I\x04\x14\xd1Q)
,而不是预期的IAMTJM
。 结果是无意义的,因为发送方破坏了有关编码序列中每个单词结束位置的信息。 如果发送方发送SQ==QU0=VEpN
,则接收方可以将其解码为三个单独的base64序列,这些序列将连接以给出IAMTJM
。
为什么不只是设计协议以在每个单词之前加上整数长度?然后接收方可以正确解码流,并且不需要填充。
这是个很好的想法,只要我们在开始编码之前知道要编码的数据长度。但如果我们不是编码单词,而是来自实时摄像头的视频块,我们可能事先不知道每个块的长度。
如果协议使用填充,就根本不需要传输长度。数据可以随着从相机输入而编码,每个块以填充结束,并且接收器将能够正确解码流。
显然,这是一个非常牵强的例子,但也许说明了为什么在某些情况下填充可能是有帮助的。
另外,这是我为您创建的任意进制转换器。享受吧!https://convert.zamicol.com/
填充字符有助于满足长度要求,不具备其他含义。
填充的十进制示例: 假设任何字符串都需要满足8个字符的任意要求,则数字640可以使用前导0作为填充字符来满足该要求,因为它们没有实际意义,"00000640"。
字节范式:在编码中,字节是事实上的标准测量单位,任何方案都必须与字节相关。
Base256 完全符合字节范式。一个字节等于 base256 中的一个字符。
Base16,十六进制或者简称 hex,每个字符使用 4 位二进制数表示。一个字节可以表示两个 base16 字符。
Base64 不像 base256 和 base16 那样能够完全适应字节范式(base32 也不能)。所有的 base64 字符可以用 6 位二进制数表示,比一个完整字节短 2 位。
我们可以将base64编码与字节范式表示为一个分数:每个字符6位,每个字节8位。简化后这个分数是3个字节对应4个字符。BASE64("") = "" (No bytes used. 0 % 3 = 0)
BASE64("f") = "Zg==" (One byte used. 1 % 3 = 1)
BASE64("fo") = "Zm8=" (Two bytes. 2 % 3 = 2)
BASE64("foo") = "Zm9v" (Three bytes. 3 % 3 = 0)
BASE64("foob") = "Zm9vYg==" (Four bytes. 4 % 3 = 1)
BASE64("fooba") = "Zm9vYmE=" (Five bytes. 5 % 3 = 2)
BASE64("foobar") = "Zm9vYmFy" (Six bytes. 6 % 3 = 0)
char*
,你需要字符串的大小或空终止符。填充是多余的。因此,OP的问题。 - Navin它并没有暗示连接(顶部答案),也没有将填充的易于实现作为显式目的。然而,考虑到整个描述,可以合理地假设这可能是为了帮助解码器以32位单位("quanta")读取输入。尽管当今已经没有好处了,在1993年,不安全的C代码很可能实际上利用了这个特性。完整的编码量总是在消息结束时完成。
b'Zm9vYmFyZm9vYg==' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy' b'Zm9vYmFyZm9vYmFyZg==' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v'
和b'Zm9vYmFyZm9vYg=' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy=' b'Zm9vYmFyZm9vYmFyZg=' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v='
- Scottlength % 4 != 0
==> 错误,因为有填充时不可能不是4的倍数),并且使得处理更加简单和高效。填充以定义的方式将输出长度填充为四个字节的倍数。