一、Base64编码
把
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[]。
实际应用中,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);
}
{
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);
}