Byte[]和BASE64之间的转换

一、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[]。

二、 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);
}

 

posted @ 2009-12-25 13:33  CASystem  阅读(232)  评论(0)    收藏  举报