Base64系列编码格式
参考:
Base64系列包含Base 64 Encoding、Base 64 Encoding with URL and Filename Safe Alphabet、Base 32 Encoding、Base 32 Encoding with Extended Hex Alphabet、Base 16 Encoding、MIME version(Header Field)六个版本,他们的编码区别并不大,下文只会明细Base 64 Encoding的编码方式和其他与其的不同。Base64系列编码格式的用途主要如下:
- 获得字符处理最大兼容性。不同硬件和规范的要求下,对部分相同字符的进制定义、使用敏感(如url不能出现字符’')等方面都限制原文本的数据传输的表达含义一致性,通过编码为通用的US-ASCII子字母集,能有效规避限制。
- 进制流编译字符流处理。由于协议封装等结果,数据传输不能直接应用二进制流,而只能支持文本字符,Base64编码进制流为字符流,规避“过度包装”的影响。如http的url中只用ASCII字符。
- 不可见字符可视化。不可见字符包含换行符\r、\n、\t等,这些不便于ctr+c、ctrl+v等操作,Base64将其可视化,方便操作。
注:Base64规范本身不具有加密解密意图,但可以通过将显式的字母表变为隐式的字符目标——将字母表打乱或替换——来使Base64编码具有加密属性。字母表类似于密码本。
Base64
字母表:[A-Za-z0-9+/],字符的标识为其索引,索引二进制数表示,如A-00_0000,/-11_1111。
编码格式:获取3个8-bit group,分解成4个6-bit group,每个6-bit group占1个byte。
补位与填充:mode = total byte nums % 3在[0, 3)区间,其中mode = 1, 2时需要补位和填充。mode=1时,第2个6-bit缺4bits,低位补位0,后续2个6-bit group用’=‘的ASCII码填充;mode=2时,第3个6-bit缺2bits,低位补位0,后续1个6-bit group用’='的ASCII码填充。
有效位比:4:3
Base 64 Encoding with URL and Filename Safe Alphabet
字母表:[A-Za-z0-9-_]。
Base 32 Encoding
字母表:[A-Z2-7]。
编码格式:获取5个8-bit group,分解成8个5-bit group。
有效位比:5:8
Base 32 Encoding with Extended Hex Alphabet
字母表:[0-9A-V]
编码格式:同Base 32 Encoding
Base 16 Encoding
字母表:[0-9A-F]
编码格式:获取1个8-bit group,分解成2个4-bit group。
补位与填充:无。
示例
Base64中字符’f’的编码:f - 0110_0110 → Zg== - 011001_100000_=_=,=没有对应的index标识。在JAVA的实现中,每个bit group都占1个byte,'='也占1个byte。