Base64编码说明
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是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
|
/
|
T o m
ASCII: 84 111 109
8bit字节: 01010100 01101111 01101101
6bit字节: 010101 000110 111101 101101
十进制: 21 6 61 45
对应编码: V G 9 t
L u c y
ASCII: 76 117 99 121
8bit字节: 01001100 01110101 01100011 01111001 00000000 00000000
6bit字节: 010011 000111 010101 100011 011110 010000 000000 000000
十进制: 19 7 21 35 30 16 (异常) (异常)
对应编码: T H V j e Q = =
代码实现:
int base64_encode( char *gb2312string, char *base64string, int gb2312stringlen )
{
static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int base64_len = 0;
// 10101001 11001000 11011101 待编码的三个字节
// | | | |
// 00101010 00011100 00100011 00011101 编码后的四个字节
while( gb2312stringlen > 0 ){
*base64string ++ = Base64Encode[(gb2312string[0] >> 2 ) & 0x3f];
if( gb2312stringlen > 2 ){
*base64string ++ = Base64Encode[((gb2312string[0] & 3) << 4) | (gb2312string[1] >> 4)];
*base64string ++ = Base64Encode[((gb2312string[1] & 0xF) << 2) | (gb2312string[2] >> 6)];
*base64string ++ = Base64Encode[gb2312string[2] & 0x3F];
}
else
{
switch( gb2312stringlen )
{
case 1:
*base64string ++ = Base64Encode[(gb2312string[0] & 3) << 4 ];
*base64string ++ = '=';
*base64string ++ = '=';
break;
case 2:
*base64string ++ = Base64Encode[((gb2312string[0] & 3) << 4) | (gb2312string[1] >> 4)];
*base64string ++ = Base64Encode[((gb2312string[1] & 0x0F) << 2)];
*base64string ++ = '=';
break;
}
}
gb2312string +=3;
gb2312stringlen -=3;
base64_len +=4;
}
*base64string = 0;
return base64_len;
}
阅读(1406) | 评论(0) | 转发(0) |