您的位置:首页 > 其它

Base64的一些描述

2012-11-27 22:10 120 查看
简介:       

       Base64是网络上最常见的用于传输8Bit的编码方式之一,更为详细的介绍可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java
Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

规则:

       大概规则:

每3个8bit的字节转换成4个6bit的字节(3*8=4*6);然后把6Bit再添两位高位0,组成四个8Bit的字节。

       详细规则:

1.把3个字符编程4个字符

2.每76个字符添加一个换行符

3.最后的结束符也要进行处理

      规则可能过于抽象难懂,举个例子:

     转换前3个字符的位为: aaaaaaaa bbbbbbbb cccccccc

     转换后4个字符的位为: 00aaaaaa 00aabbbb 00bbbbcc 00cccccc

     转换前的字符是按照ASCII进行位的排列的,转换后虽然仍然可以使用ASCII进行返回,但实际上这是十分愚蠢的,试想,如果ASCII能够解决此类问题, 又何必再进行转换呢。因此RFC2045提供了如下的转换对照表:

索引对应字符索引对应字符索引对应字符索引对应字符
0A17R34i51z
1B18S35j520
2C19T36k531
3D20U37l542
4E21V38m553
5F22W39n564
6G23X40o575
7H24Y41p586
8I25Z42q597
9J26a43r608
10K27b44s619
11L28c45t62+
12M29d46u63/
13N30e47vpad=
14O31f48w
15P32g49x
16Q33h50y
 上表是标准的Base64转换。也就是说还存在Base64转换的变种,但变的一般是+ / =,相同的索引值对应不同的内容,这看实际需要了。
可以看下面的例子加深印象。

转换前的二进制表示:10101101 10111010 01110110

转换后的二进制表示:00101011
00011011 00101001 00110110

转换后的十进制表示:      43     27
41 54

对照上表转换后的字符为:r     b                  p               2

所以上面的24位所代表的字符经Base64转换后的字符为rbp2。

具体实现算法步骤:

       1.获取编码后的第一个字节,即源字符的第一个字节右移2位,将低2位去掉,对高2位补0

       2.获取编码后的第二个字节,即源字符的第一个字节高6位去掉左移四位,源字符的第二个字节右移4位,也就是源第一字节低2位+源第二字节高4位,对高2位补0

       3.获取编码后的第三个字节,即源字符的第二个字节高4位去掉左移两位,源字符的第三个字节右移6位,也就是源第二字节低4位+源第三字节高2位,对高2位补0

      4.获取编码后的第四个字节,即源字符的第三个字节低6位,对高2位补0

 
   5.当编码的字节数为76时,添加一个换行符

 
  上面是在所要转换的字节数恰好是3的倍数。但如果要转换的字节数不是3的倍数呢?这里给出了解决办法:

 
   6.源字符的字节数不是3的倍数时使用0进行补充,转换时Base64编码用=来代替。这也是为什么有些Base64编码有=的原因,也是=存在的意义。Base64编码实际上最多只有2个=,因为:

 
      余数 = 源字符数 mod 3;

 
       所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示源字节数正好是3的倍数(最理想的情况)。如果是1的话,为了让Base64编码是3的倍数,就要补2个=;同理,如果是2的话,就要补1个=。

 
     对于解码,就是编码的逆过程。

下面是Base64编码与解码的几个版本的实际代码:

Base64算法的Delphi版实现:Delphi版的Base64转换函数(修改版)

Base64算法的C语言版实现:Base64 编解码C语言实现

Base64算法的C++语言实现:Encoding and decoding base64 with C++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: