为什么要使用Base64及其编码原理和实现

来源:互联网 发布:java ca认证登录 编辑:程序博客网 时间:2024/05/20 04:11

维基百科:

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

什么要编码

在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

其实BASE64编码的初衷是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要意义:所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑,并且对于数据流来说是一种简单的加密。

比如说,在Internet里,E-mail的传送是只能传送US-ASCII格式的文字讯息(历史原因),ASCII是7位的,而非ASCII格式的档案,在传送过程中若不先经过编码,先编成7位再传送,则在传送过程中会因为这7位元的限制而遭到拆解,拆解之后只会让收信方看到一堆乱七八糟不知所云的东西。经过编码后的资料,在传送过程中才可顺利传送,不会有“被截掉一个bit”的危险,但是收信方必须具有解码程序,将这份经过编码的东西还原,才能解读“天书”,看到寄信人要传送的真实信息。

再比如传输一个纯文本协议,二进制中可能会出现被当做控制字符处理的部分。这样引起传输失败。

算法简介

所谓Base64,就是说选出64个可打印字符—-小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/”(再加上作为补全字的”=”,实际上是65个字符),作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

1.将每三个字节作为一组,一共是24个二进制位。

2.将这24个二进制位分为四组,每个组有6个二进制位。

3.在每组前面加两个00,扩展成32个二进制位,即四个字节。

4.如果字节数不足三,则这样处理:

a)二个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个”=”号。

b)一个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个”=”号。

5.根据下表,得到扩展后的每个字节的对应符号,即为Base64的编码值。

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

转换前 10101101 10111010 01110110
转换后 00101011 00011011 00101001 00110110
十进制 43 27 41 54
对应码表中的值 r b p 2

算法实现

如果感兴趣的话,可以到以下链接下载:

http://download.csdn.net/detail/u012611878/9715927

工程代码中提供了Base64对文本内容进行编码或者解码的相关接口,命令行即可进行转换,移植性强。
欢迎批评指正。

PS:由于字符编码的问题,转换过程中的结果可能有所偏差,建议使用的时候统一转为utf-8或者GBK格式,这里不提供相关转换接口。

0 0
原创粉丝点击