« javascript event 事件解析« »高度な JavaScript 技集 »
使用混合脚本编程来实现的Base64编码
在近来的工作中,需要在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>
 


Tags: javascript  

原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/

本文链接地址:http://www.busfly.net/csdn/post/javascript-Base64.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Feed订阅集
网站分类
勤劳致富^.^
最近发表
最新评论及回复
最近留言
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(VS为主):3769186.