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提供了如下的转换对照表:
上表是标准的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++
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 |
可以看下面的例子加深印象。
转换前的二进制表示: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++
相关文章推荐
- C#--第四周实验--任务4--定义一个描述坐标点的CPoint类,派生出直线类Cline,在派生出矩形类CRect,实现一些功能。
- 关于电子商务的一些描述
- 关于sort()的使用的一些描述
- 一些windows常用进程的描述
- 描述一些,你们在开发中常见的生活案例
- openCV中的特征点检测、描述子计算、特征匹配的一些类
- 一些书中很好理解的概念描述
- VC6.0 工程转到VS2008一些问题的描述及解决方法(附有VS2008发布程序介绍)
- 从mount -o一些理解结合cfs进行描述,窥探该项目全局。
- 关于swap()使用的一些描述
- C Sharp 开发自定义控件时,对属性事件等的一些描述与设置
- IT技术实效主义者的一些工具(如何阅读实用性的书\IT技术水平\如何描述数据模型)
- 关于基于XML描述的GUI应用的一些资源
- 关于一些定时任务的简单描述
- FJ的字符串 /*问题描述 FJ在沙盘上写了这样一些字符串: A1="A" A2="ABA" A3="ABACABA" A4="ABACABADABACABA" ... ...
- 软件标书中一些常用的技术描述总结
- VC6.0 工程转到VS2010一些问题的描述及解决方法
- 一些常用的场景进行描述分析(权限管理、6个典型场景)
- 网上收集的一些常用的排序算法描述
- IT技术实效主义者的一些工具(如何阅读实用性的书\IT技术水平\如何描述数据模型)