根据base64编码原理 ,解码相对也很简单,需要用一个辅助函数来得到base64编码中对应的码值
Base64编码表
码值
|
字符
|
|
码值
|
字符
|
|
码值
|
字符
|
|
码值
|
字符
|
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
|
/
|
char GetBase64Value(char ch) //得到编码值
{
if ((ch >= 'A') && (ch <= 'Z')) // A ~ Z
return ch - 'A';
if ((ch >= 'a') && (ch <= 'z')) // a ~ z
return ch - 'a' + 26;
if ((ch >= '0') && (ch <= '9')) // 0 ~ 9
return ch - '0' + 52;
switch (ch) // 其它字符
{
case '+':
return 62;
case '/':
return 63;
case '=': //Base64 填充字符
return 0;
default:
return 0;
}
}
int base64_decode( char *gb2312string, char *base64string, int base64_len) //解码函数
{
int count = 0;
int index = base64_len-1;
uint_8 Base64Encode[4];
int gb2312stringlen=0;
while(base64string[index] == '=') {
count++;
index--;
}
if( base64_len % 4 ) //如果不是 4 的倍数,则 Base64 编码有问
{
gb2312string[0] = '\0';
return -1;
}
while( base64_len > 3 ) //当待解码个数不足4个时,将忽略它
{
// 取出base64编码中的四个字符, 然后通过一个函数得每个字符对应的码值 ,再进行相应的移位操作就可以得到原始编码
Base64Encode[0] = GetBase64Value(base64string[0]);
Base64Encode[1] = GetBase64Value(base64string[1]);
Base64Encode[2] = GetBase64Value(base64string[2]);
Base64Encode[3] = GetBase64Value(base64string[3]);
*gb2312string ++ = (Base64Encode[0] << 2) | (Base64Encode[1] >> 4);
*gb2312string ++ = (Base64Encode[1] << 4) | (Base64Encode[2] >> 2);
*gb2312string ++ = (Base64Encode[2] << 6) | (Base64Encode[3]);
base64string += 4;
base64_len -= 4;
gb2312stringlen += 3;
}
return gb2312stringlen - count;
}
阅读(1529) | 评论(0) | 转发(0) |