Base64 的原理
把3个8 bit 的二进制数转换成4个6字节的二进制数,而这4个6字节数,都是可见打印字符。(这也是为什么要转换的原因)
如上图所示,b1,b2,b3三个数,经过位的偏移,6 bit 为单位,则组成了新的4个数。因为是6 bit ,所以可以由0~63个字符对应,然后根据得到的数做索引获取其值,则是编码之后的值。
这0~63个字符表,需要以 http://www.faqs.org/rfcs/rfc3548.html 为准。
Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y
举例
图片来源:http://blog.chacuo.net/719.html
代码演示
$a = "Man"; $ascii[0] = ord($a[0]); $ascii[1] = ord($a[1]); $ascii[2] = ord($a[2]); // 右移2位 $res[0] = $ascii[0] >> 2; // 第一个值取最后4位,然后再左移4位;第二个值右移4位。两者相与 $res[1] = (($ascii[0] & 0x3) << 4) | ($ascii[1] >> 4); // 第二个值取后4位,然后再左移2位;第三个值右移6位。两者相与 $res[2] = (($ascii[1] & 0xf) << 2) | ($ascii[2] >> 6); // 第四个值取后6位 $res[3] = $ascii[2] & 0x3f;
Base62到底是什么鬼
没有一个标准,怀疑是不是就一套自定义的hash 算法,从62个字符来映射。