Base64编码

##简介
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。

常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据。

URL里传递复杂数据参数时,也会用到Base64。(但不是标准的Base64,详见下文。)

##编码原理
原理相当简单,以64个可打印字符为基础,将二进制数据转成这64个字符。

###64个字符















































































































































































ValueChar ValueChar ValueChar ValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

最后两个字符在不同应用场景会有一些变种或改良。

###转换方法

因为2的6次方等于64,那么以6Bit做为一个Base64单元,表示一个可打印字符。3个字节有24Bit,可以对应4个Base64单元。(3 8 = 4 6 = 24)转换方法也就是:

每3个字节为一组,共24Bit;24Bit再分组,6Bit一组,分成4组,每个6Bit组高位补两个0;这样3个字节就转成了Asc值小于64的4个字节。再把这些字符以其值,对应到上面的64个字符。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

Base64编码规则为:

  1. 把3个字符转成4个字符
  2. 每76个字符加一个换行符
  3. 最后的结束符也要处理

例如:

转换前: aaaaaabb ccccdddd eeffffff
转换后: 00aaaaaa 00bbcccc 00ddddee 00ffffff

##URL参数使用Base64

RFC 1738中规定:

“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),”

[not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

>
“只有字母和数字[0-9 a-z A-Z]、一些特殊符号“$-_.+!*’(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”

可采用一种用于URL的改进Base64编码,它不在末尾填充’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。