标题: 使用混合脚本编程来实现的Base64编码
- birdshome 2005-01-12 00:07 阅读:3898
- 评论:17 查看评论 | 添加评论
    在近来的工作中,需要在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
    
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">[图片]
[图片]var Base64Alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
[图片]    'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
[图片]    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'];
[图片]
[图片]function EncodeBase64(string)
[图片][图片][图片]{
[图片]    var hexString = string.getGBCode();
[图片]    window.status = hexString; 
[图片]    var base64 = '';
[图片]    var B64A = Base64Alphabet;
[图片]    var padCount = hexString.length%3;
[图片]    var count = parseInt(hexString.length/6);
[图片]    var i = 0; 
[图片]    for ( i=0 ; i < count ; ++i )
[图片][图片]    [图片]{
[图片]         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
[图片]         var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
[图片]         var intC = parseInt(hexString.charAt(i*6+4)+hexString.charAt(i*6+5), 16); 
[图片]         var part1 = intA >> 2;
[图片]         var part2 = ((intA & 0x03) << 4) | (intB >> 4);
[图片]         var part3 = ((intB & 0x0f) << 2) | (intC >> 6);
[图片]         var part4 = intC & 0x3f;
[图片]         base64 += B64A[part1] + B64A[part2] + B64A[part3] + B64A[part4]; 
[图片]    }
[图片]    if ( padCount == 1 )
[图片][图片]    [图片]{
[图片]         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
[图片]         var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
[图片]         var part1 = intA >> 2;
[图片]         var part2 = ((intA & 0x03) << 4) | (intB >> 4);
[图片]         var part3 = ((intB & 0x0f) << 2);
[图片]         base64 += B64A[part1] + B64A[part2] + B64A[part3] + '=';
[图片]    }
[图片]    if ( padCount == 2 )
[图片][图片]    [图片]{
[图片]         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
[图片]         var part1 = intA >> 2;
[图片]         var part2 = ((intA & 0x03) << 4);
[图片]         base64 += B64A[part1] + B64A[part2] + '==';
[图片]    }        
[图片]    return base64;
[图片]}
[图片]</script>
[图片][图片]<script language="vbscript">[图片]
[图片]function vbGetGBCode(str)
[图片]    dim i, length, s
[图片]    length = len(str)
[图片]    for i=1 to length
[图片]        hexCode = hex(asc(str.charAt(i-1)))
[图片]        if (len(hexCode) mod 2) = 0 then
[图片]            s = s & hexCode
[图片]        else
[图片]            s = s & "0" & hexCode
[图片]        end if
[图片]    next
[图片]    vbGetGBCode = s
[图片]end function
[图片]</script>
[图片][图片]<script language="javascript">[图片]
[图片]String.prototype.getGBCode = function()
[图片][图片][图片]{
[图片]    return vbGetGBCode(this);
[图片]}
[图片]</script>

    附3:在线测试 http://zhilee.aehk.com/demo/TestBase64.htm
查看评论 | 添加评论
返回顶部 | 返回首页