在近来的工作中,需要在Web页上制作复杂的逻辑和框架以及后台之间交换数据,特别是和后台交换数据,编码是个必须考虑的问题。否则可能会因为编码不同,把脚本的执行给搞得乱七八糟,根本得不到想要的结果。Base64是一种常用而又简单的编码,就先从它下手弄弄了。
关于Base64的详细定义可以查看 RFC 2045,如果简单的说一下呢:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。好玩,弄来不被人识别?不识别就不识别嘛,反正程序能之别就行了。
这个编码为什么叫Base64呢?这是应为它的转换需要依赖一张64个字符的转换表,叫做The Base64 Alphabet。 Base64以3个字节为一个转换单位,把这24bits分为4份,高位补零,再查前面说的那个转换表,就编码完毕了。如果被转换的数据(以byte为单位)不能被3整除,按余数补"="(pad),当然最多也就只有两种可能,不是补一个pad就是补两个pad。
例如转换"博客园",这三个字的内码十六进制为:B2A9 BFCD D4B0
二进制为:10110010 10101001 10111111 11001101 11010100 10110000
六个一拨: 00101100 00101010 00100110 00111111 00110011 00011101 00010010 00110000,再按新的编码转为十进制查表后得到"博客园"的base64编码为:"sqm/zdSw"。
// 蓝色的0是补位的
之前有人用JavaScript来做过Base64编码,结果居然使用escape来获取字符的编码,这样当遇到被转换的字符有汉字时就faint掉了,escape在基于NT的32位系统下得到的是汉字的 Unicode编码。但是JavaScript却真的没有办法得到汉字的GB码:( 我也郁闷了半天,后来在 mozart0的帮助下使用VBScript加JScript混合搞定了这个编码算法实现 。
附1:The Base64 Alphabet
附2:base64编码源代码
关于Base64的详细定义可以查看 RFC 2045,如果简单的说一下呢:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。好玩,弄来不被人识别?不识别就不识别嘛,反正程序能之别就行了。
这个编码为什么叫Base64呢?这是应为它的转换需要依赖一张64个字符的转换表,叫做The Base64 Alphabet。 Base64以3个字节为一个转换单位,把这24bits分为4份,高位补零,再查前面说的那个转换表,就编码完毕了。如果被转换的数据(以byte为单位)不能被3整除,按余数补"="(pad),当然最多也就只有两种可能,不是补一个pad就是补两个pad。
例如转换"博客园",这三个字的内码十六进制为:B2A9 BFCD D4B0
二进制为:10110010 10101001 10111111 11001101 11010100 10110000
六个一拨: 00101100 00101010 00100110 00111111 00110011 00011101 00010010 00110000,再按新的编码转为十进制查表后得到"博客园"的base64编码为:"sqm/zdSw"。
// 蓝色的0是补位的
之前有人用JavaScript来做过Base64编码,结果居然使用escape来获取字符的编码,这样当遇到被转换的字符有汉字时就faint掉了,escape在基于NT的32位系统下得到的是汉字的 Unicode编码。但是JavaScript却真的没有办法得到汉字的GB码:( 我也郁闷了半天,后来在 mozart0的帮助下使用VBScript加JScript混合搞定了这个编码算法实现 。
附1:The Base64 Alphabet
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
|
G
|
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
|
/
|
附2:base64编码源代码
<
script
language
="javascript"
>
</
script
>
< script language ="vbscript" > </ script >
< script language ="javascript" > </ script >
< script language ="vbscript" > </ script >
< script language ="javascript" > </ script >
附3:在线测试 http://zhilee.aehk.com/demo/TestBase64.htm
本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。