base64位编码原理与分析

转自:http://blog.csdn.net/caianye/article/details/7592806

打开一封QQ邮箱,显示邮件原文,你将会看到如下这样的信息:

This is a multi-part message in MIME format.

------=_NextPart_4CA2B3AA_08661D78_10BF6743
Content-Type:text/html;
	charset="utf-8"
Content-Transfer-Encoding:base64
    说明这封邮件的内容是64位编码的。

    什么是Base64?

    Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 

    由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。所以base64位编码才存在。

    Base64编码的原理

    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。    

    字符串“张3” 
    11010101 11000101 00110011 

    转化成base64位编码的内容是:

    00110101 00011100 00010100 00110011 

    最后参看base64编码对应的字符表:

Base64 编码表
Value Char   Value Char   Value Char   Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

    Base64编码后得到的十进制值为:53 34 20 51;参考对应的base64字符表,得到的字符是"1iUz".

  Base64将3个字节转变为4个字节,因此,编码后的代码量(以字节为单位,下同)约比编码前的代码量多了1/3。之所以说是“约”,是因为如果代码量正好是3的整数倍,那么自然是多了1/3。但如果不是呢? 
  细心的人可能已经注意到了,在The Base64 Alphabet中的最后一个有一个(pad) =字符。这个字符的目的就是用来处理这个问题的。 
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”: 
  11010101 HEX:D5 11000101 HEX:C5 
  00110101 00011100 00010100 
  十进制53 十进制34 十进制20 pad 
  字符’1’ 字符’i’ 字符’U’ 字符’=’ 
  这样,最后的2个字节被整理成了“1iU=”。 同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=” 


展开阅读全文

没有更多推荐了,返回首页