Base64编码原理分析与PHP实现

  

<强> 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实现