在相关说明中,这是我为您创建的任意基础转换器。享受!
https://convert.zamicol.com/
什么是填充字符?
填充字符有助于满足长度要求并且没有任何意义。
填充的十进制示例:
给定所有字符串长度为 8 个字符的任意要求,数字 640 可以使用前面的 0 作为填充字符来满足此要求,因为它们没有任何意义,“00000640”。
二进制编码
字节范式:字节是事实上的标准测量单位,任何编码方案都必须与字节相关。
Base256 完全符合这种范式。 base256 中一个字节等于一个字符。
Base16,十六进制或十六进制,每个字符使用 4 位。一个字节可以代表两个base16字符。
Base64 与 base256 和 base16 不同,不能均匀地融入字节范式(base32 也不适合)。所有 base64 字符都可以用 6 位表示,不足 2 位是一个完整的字节。
我们可以将 base64 编码与字节范式表示为分数:每个字符 6 位超过每个字节 8 位。减少这个分数是 3 个字节超过 4 个字符。
这个比例,每 4 个 base64 字符占 3 个字节,是我们在编码 base64 时要遵循的规则。 Base64 编码只能保证使用 3 字节包进行测量,不像 base16 和 base256,每个字节都可以独立存在。
那么为什么鼓励使用填充,即使编码可以在没有填充字符的情况下正常工作?
如果流的长度未知,或者如果准确知道数据流何时结束会有所帮助,请使用填充。填充字符明确表示那些额外的点应该是空的,并排除任何歧义。即使长度未知,您也会知道数据流的结束位置。
作为一个反例,JOSE 等一些标准不允许使用填充字符。在这种情况下,如果缺少某些东西,加密签名将不起作用或其他非 base64 字符将丢失(如“.”)。虽然没有对长度做出假设,但也不需要填充,因为如果出现问题,它根本就不起作用。
这正是base64 RFC 所说的,
在某些情况下,在基本编码数据中使用填充 ("=")
不需要或使用。在一般情况下,当假设
无法确定传输数据的大小,需要填充
产生正确的解码数据。
[...]
base 64 中的填充步骤 [...] 如果不正确
实施,导致编码数据的非显着改变。
例如,如果输入对于 base 64 编码只有一个八位字节,
然后使用第一个符号的所有六位,但只有第一个
使用下一个符号的两位。这些填充位必须设置为
通过符合编码器归零,这在描述中进行了描述
在下面的填充上。如果这个属性不成立,就没有
碱基编码数据的规范表示,以及多个碱基
编码的字符串可以解码为相同的二进制数据。如果这
属性(以及本文档中讨论的其他内容)成立,一个规范的
编码是有保证的。
填充允许我们以不丢失位的承诺来解码 base64 编码。如果没有填充,则不再明确确认以三字节包进行测量。如果没有填充,您可能无法保证在没有额外信息的情况下准确再现原始编码,这些信息通常来自堆栈中的其他位置,例如 TCP、校验和或其他方法。
示例
这是 RFC 4648 (https://www.rfc-editor.org/rfc/rfc4648#section-8) 的示例表单
“BASE64”函数中的每个字符使用一个字节(base256)。然后我们将其转换为 base64。
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.)
这是一个你可以玩的编码器:http://www.motobit.com/util/base64-decoder-encoder.asp