在相关说明中,这是我为您创建的任意基本转换器。享受!
https://convert.zamicol.com/
什么是填充字符?
填充字符有助于满足长度要求并且没有任何意义。
填充的十进制示例:
给定所有字符串长度为 8 个字符的任意要求,数字 640 可以使用前面的 0 作为填充字符来满足此要求,因为它们没有任何意义,“00000640”。
二进制编码
字节范式:字节是事实上的标准度量单位,任何编码方案都必须与字节相关。
Base256完全符合这种范式。一个字节等于 base256 中的一个字符。
Base16,十六进制或十六进制,每个字符使用 4 位。一个字节可以表示两个 base16 字符。
与 base256 和 base16 不同, Base64并不完全适合字节范式(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