周梦康 发表于 2015-12-30 3996 次浏览 标签 : 计算机基础

Base64 的原理

把3个8 bit 的二进制数转换成4个6字节的二进制数,而这4个6字节数,都是可见打印字符。(这也是为什么要转换的原因)

base64 算法原理

如上图所示,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个字符来映射。

评论列表