把byte[]中的元素当做无符号八位整数转换成只含有64个基本字符的字符串,这些基本字符是:
l 大写的A-Z
l 小写的a-z
l 数字0-9
l '+' 和 '/'
这64个字符构成BASE64的字符集。‘=’,为填充字符,结尾处可以填充0-2个填充字符
Base64是将原文按照每 3 个字节一组分开,这个 3 字节组中的每一组将被按照位分解成 4 个部分,每个部分 6 个位,在这 4 个部分的每个部分高位加上 2 个 0构成一个新的 4 字节组,新的字节组中,每个字节只有 6 位,能表示64个值。
在原文在转换为BASE64编码时,试是以3个字节为一组转换成4字节一组的BASE64编码。如果原文不是三字节的倍数,可能多出一个字节和两个字节,分别会被转为2字节和3字节的BASE64编码,这时编码系统应该在形成的BASE64编码最后添加上填充符”=”,保证BASE64编码长度是4的倍数。所以在BASE64编码后添加的填充符”=”可能为0-2个。
BASE64编码对照表如下:
|
Value
|
Encoding
|
Value
|
Encoding
|
Value
|
Encoding
|
Value
|
Encoding
|
|
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
|
/
|
Byte[]和BASE64之间的转换纯粹就是表现形式的一种转换,它们之间有直接的对应关系,不涉及到使用何种代码页的问题,BASE64表达的也是字节流。
实际应用中,dotnet提供的两个主要的BASE64方法Convert.ToBase64String 和 Convert.FromBase64String,并不是把Byte[]直接转成相应的BASE64的字节流,而是转换成unicode的等价字符串,就是base64的值对应的字符在unicode的等价字符。
如果要把BASE64的等价字符串转成Byte[],还是需要指定一个代码页然后按照指定的编码转成Byte[]。
二、 Byte[]和BASE64之间的转换操作
static void Main(string[] args)
{
string factString = "中华人民共和国";
byte[] myByte;
string Base64Str;
//先把字符串按照utf-8的编码转换成byte[]
Encoding myEncoding = Encoding.GetEncoding("utf-8");
//myByte中获得这样的字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
myByte = myEncoding.GetBytes(factString);
//把byte[]转成base64编码,这个例子形成的base64编码的unicode等价字符串为:"5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9"
Base64Str = Convert.ToBase64String(myByte);
//再从base64编码转成byte[],又恢复为字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
myByte = Convert.FromBase64String(Base64Str);
//用同一个Encoding对象把byte[]转成字符串:"中华人民共和国"
factString = myEncoding.GetString(myByte);
Console.WriteLine(factString);
}