一、简介
编码时,6位比特编码成1个字符;解码时,1个字符解码成6位比特。6位比特对应2^6
种可能取值,故而被称为“Base64编码”。
二、原理
首先给出一个映射表,表示的含义是:编码时,给定一个“6位比特”,其相应的十进制值对应的映射字符即为被编码成字符;解码时,逆向化过程。实际上除了以下64个字符外,还有一个填充字符“=”,对应“比特全属于填充字节的6位比特”。
十进制值 | 映射字符 | 十进制值 | 映射字符 | 十进制值 | 映射字符 | 十进制值 | 映射字符 |
---|---|---|---|---|---|---|---|
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 | / |
2.1、编码
给定一个字节流,进行Base64编码的过程如下:将字节流表示成比特流,如果比特流总个数不为24的倍数,则在尾部添加填充字节(填充字节为0字节,8位比特全为0),使得最终比特流总个数为24的倍数。接着,以“6位比特”为单元,根据上述映射表进行编码,比特全属于填充字节的“6位比特”被编码成字符“=”,而不是字符“A”。
实验如下:
原比特流 | 填充比特流 | 被编码成字符串 |
---|---|---|
010101011010101000001111 | 无 | VaoP |
010110100110000000000000 | 无 | WmAA |
0101101001100000 | 00000000 | WmA= |
01101100 | 0000000000000000 | bA== |
2.2、解码
编码过程的逆向化过程。
三、使用
使用“commons-codec”包的“org.apache.commons.codec.binary.Base64”类。
3.1、编码
实验代码如下:
1 | import org.apache.commons.codec.binary.Base64; |
打印结果如下:
1 | VaoP |
3.2、解码
实验代码如下:
1 | import org.apache.commons.codec.binary.Base64; |
打印结果如下:
1 | [85, -86, 15] |
四、其他
以上只是核心原理介绍,实际中有很多变种,上述“commons-codec”包中的Base64编码实现也只是其中的一种变种实现。
参考文献: [1]http://blog.csdn.net/xuefeng0707/article/details/19845111 [2]http://www.rfc-editor.org/rfc/rfc2045.txt [3]https://en.wikipedia.org/wiki/Base64