0%

Base64编码

一、简介

编码时,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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.apache.commons.codec.binary.Base64;

public class Main {
public static void main(String[] args) {
byte[] a = new byte[3];
// 010101011010101000001111
a[0] = 85;
a[1] = -86;
a[2] = 15;

System.out.println(Base64.encodeBase64String(a));

byte[] b = new byte[3];
// 010110100110000000000000
b[0] = 90;
b[1] = 96;
b[2] = 0;
System.out.println(Base64.encodeBase64String(b));

byte[] c = new byte[2];
// 0101101001100000
c[0] = 90;
c[1] = 96;
System.out.println(Base64.encodeBase64String(c));

byte[] d = new byte[1];
// 01101100
d[0] = 108;
System.out.println(Base64.encodeBase64String(d));
}
}

打印结果如下:

1
2
3
4
VaoP
WmAA
WmA=
bA==

3.2、解码

实验代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.apache.commons.codec.binary.Base64;

import java.util.Arrays;

public class Main {
public static void main(String[] args) {
String a = "VaoP";
System.out.println(Arrays.toString(Base64.decodeBase64(a)));

String b = "WmAA";
System.out.println(Arrays.toString(Base64.decodeBase64(b)));

String c = "WmA=";
System.out.println(Arrays.toString(Base64.decodeBase64(c)));

String d = "bA==";
System.out.println(Arrays.toString(Base64.decodeBase64(d)));
}
}

打印结果如下:

1
2
3
4
[85, -86, 15]
[90, 96, 0]
[90, 96]
[108]

四、其他

以上只是核心原理介绍,实际中有很多变种,上述“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
您的支持将鼓励我继续分享!