Base64的一些描述

简介:       

       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提供了如下的转换对照表:

索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
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 pad =
14 O 31 f 48 w

15 P 32 g 49 x

16 Q 33 h 50 y

 上表是标准的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++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值