<强> Base64 强>是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64年,所以每6个为一个单元,对应某个可打印字符。
三个咬有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。
在Base64中的可打印字符包括字母a - z、a - z,数字0 - 9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
如在mime(多用途邮件扩展)中,Base64的使用的64个可打印字符
对应的转换关系为
0 - 63: A-Za-z0-9 +/
转换的时候,将三个字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,于缓冲器中剩下的钻头用0补足。然后,每次取出6(因为2 <一口> 6 一口>=64)个,按照其值选择<代码> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 +/> 代码中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
当原数据长度不是3的整数倍时,如果最后剩下一个输入数据,在编码结果后加2个“=?如果最后剩下两个输入数据,编码结果后加1个“=?如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。
实例分析:
编码:“Lailaiji”
通过查ASCII表找到对应关系
L: 0 x4c |,答:0 x61, |,我:0 x69,|,l: 0 x6c,|大敌;j: 0 x6a
因此转换成二进制为:0100 1100,0110 0001,0110 1001,0110 1100,,
第一步:先取三个字节的数据即:
第三步,这时剩余字节为:0110 1010,0110 1001不足3个字节,需要在从低位以0进行补充,即成
经过以后的运算后,我们将得到一组位序列:
00
,
转换成十进制为:19日,6日,5日,41岁,27岁,6日,5日,41岁,26岁,38岁,36岁,0
对应的字符为:T、G、F p, b, G、F p, a, m, k,一个
特别注重的是,最后一个字节0000 0000即0 x00,通过查表为,由于最后这8位是补充的,所以它应当被转换成=号,而不是一个
因此:最终结果为:TGFpbGFpamk=
PHP实现:
& lt; PHP ? $ input =,”赖来基”; $ obj =, new MyBase64 (); 美元$ output =, obj→编码(输入); echo “编码:“output.PHP_EOL美元; $ output =,美元obj→解码(输出); echo “解码:“output.PHP_EOL美元; class MyBase64 { private _table 美元;=,数组(); private _revtable 美元;=,数组(); public function  __construct () { $ this→_initTable (); } public function 解码(字符串) { $ orign_len =, strlen ($ string); $ j =, 0; $ ret =,空; (我=0;美元,美元iBase64编码原理分析与PHP实现