原文转自 http://www./archives/638
1: 为什么需要base64? ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间. 在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除. 如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件? 1.a 什么是url_safe base64编码? 在上面的base64传统编码中会出现+, /两个会被url直接转义的符号,因此如果希望通过url传输这些编码字符串,我们 需要先做传统base64编码,随后将+和/分别替换为- _两个字符,在接收端则做相反的动作解码 http://www./rfc/rfc4648.txt /** * URL base64解码 * '-' -> '+' * '_' -> '/' * 字符串长度%4的余数,补'=' * @param unknown $string */ function urlsafe_b64decode($string) { $data = str_replace(array('-','_'),array('+','/'),$string); $mod4 = strlen($data) % 4; if ($mod4) { $data .= substr('====', $mod4); } return base64_decode($data); } /** * URL base64编码 * '+' -> '-' * '/' -> '_' * '=' -> '' * @param unknown $string */ function urlsafe_b64encode($string) { $data = base64_encode($string); $data = str_replace(array('+','/','='),array('-','_',''),$data); return $data; }
2: 一句话说完base64怎么工作的? 把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元, base64_encode(’PHP’) ==> ‘UEhQ’, 编码过程如下: 3: 如果每6位砍成1段,但不能整除,余下2个位或4位怎么办? 用”0″来补至6位, 并再次转化为”base64字符表”中的某个字符. 然后,再用”=”字符当做6个位,继续填充,直至总位数能被8带整除.
4:base64表示图片 通过上面的演示,可以看出,base64也可以编码二进制文件,如邮件中的图片和附件. 用例:base64(’abc.png’) ==> ‘encoded-result’; 看到下面这个5角星了吗? 右键看源码,就会发现图片是一串字符串 5: base64编码后字节的变化 很容易推算出, 编码后,每6个位变成8个位. 6: base64串结尾的”=”可以去掉吗? 从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号, 那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范. 实测PHP中的base64_decode函数,并不检测尾部的等号是否完整. |
|