一般大多数包含"="的不是"Base64"编码格式,只有"quoted-printable"编码格式才会经
常出现"="虽然都是MIME编码,但是算法不一样
,"quoted-printable"的我不太清楚.讲一下Base64的吧.
Base64算法是把3个8位字符(24)转换成4个6位字符(32),因此编码后的长度会扩大1/3,
进行编码转换时需要用到一张Base64的编码表:
Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
在VB中可以简单的将其保存为一个常量:
Private Const Base64Table =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
编码过程是这样的,第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据
这个数值取到表上相应的字符,就是第一个目标字符
,然后将第一个字符左移6位加上第二个字符右移4位,即获得第二个目标字符,再将第二
个字符左移4位加上第三个字符右移6位,获得第三个
目标字符,最后取第三个字符的右6位即获得第四个目标字符.
例如我们取一个简单的字符串"TEST..."
将其用SourceByte = StrConv(SourceText, vbFromUnicode)转换后获得二进制数组:
T E S T ...
84 69 83 84 ...
01010100 01000101 01010011 01010100 ...
01010100/01000101/01010011/01010100
01010100010001010101001101010100
转换后:
01010100010001010101001101010100
010101/000100/010101/010011/010101/00
010101 000100 010101 010011 010101 00....
21 4 21 19 21 ...
V E V T V ...
最后得到的就是"VEVTV..."
对于第一个目标字符我们可以这样做:
(SourceByte(1) and 252)/4
第二个:
(SourceByte(1) and 3)*64 + (SourceByte(2) and 240)/16
第三个:
(SourceByte(2) and 15)*16 + (SourceByte(3) and 48)/64
第四个:
(SourceByte(3) and 63)
Base64解码过程正好相反,我就不多说了,另外有关MIME的RFC还是有很多的,如果需要详
细情况请自己查找,我上面那张表就摘自
<RFC1521#
MIME (Multipurpose Internet Mail Extensions)
Part One: Mechanisms for Specifying and Describing the Format of Internet
Message Bodies>
本文地址:http://com.8s8s.com/it/it6604.htm