使用混合脚本编程来实现的Base64解码

    前几天用脚本做了个Base64编码程序,今天把解码程序也实现了,不过同样是使用JScript和VBScript混合编程来搞定的。

    解码的过程和编码过程是基本相同的,代码如下:

<script language="javascript"></script>
<script language="javascript"></script>
<script language="vbscript"></script>

    其中第一段脚本定义的是一个类似hashtable的结构,这样的目的是为了避免每次去手动遍历在编码程序中定义的那个Base64Alphabet数组来做转换,并且这个结构的效率很高。原理解释可参看:比较JavaScript中的集合及其检索效率。对于这个hashtable,由于不能使用'+'、'/'和'='来做索引,所以实现了一个getCharCode的方法来作为代理,同时利用这个代理过程把=(pad)映射为了0。这样的好处就是我们不用在解码程序里专门去处理pad了,因为即使有pad,对于解码后的十六进制字符串也就是多些0在后面而已,并且是每有一个pad会对应多出一个'00'。在处理十六进制字符串之前执行一下:

    if ( padCount > 0 )
    {
         hexString 
= hexString.substr(0, hexString.length-padCount*2);
    }

就行了。

    这个解码代码中还有两个地方可以优化,一是part1、part2、part3和part4那里,可以使用一个part数组 var part = new Array(4); 然后从strCoding里面去遍历4个连续有效的字符出来,然后再求intA,intB,intC。这样就可以省去解码开始前的数据清理工作 strCoding = strCoding.replace(/\s+/g, '');,同时还可以忽略非Base64Alphabet中定义的字符带来的错误干扰。二是intA、intB和intC也可以用一个数组来做,这样就可以把代码:

    if ( intA < 0x10 )
    {
         hexString 
+= '0';
    }   
    hexString 
+= intA.toString(16);
    
if ( intB < 0x10 )
    {
         hexString 
+= '0';
    }
    hexString 
+= intB.toString(16);
    
if ( intC < 0x10 )
    {
             hexString 
+= '0';
    }  
    hexString 
+= intC.toString(16); 

做成一个3次的循环,否则这样流水账般的代码太ugly了

    当然这个解码程序的效率也不是很高,数据量太大的时候几乎就没有什么可用性了,这里我只是主观的觉得两个脚本引擎轮番调用可能也是性能瓶颈,如果您有好的优化方法,请不吝赐教哦

    在线demo: http://zhilee.aehk.com/demo/TestBase64.htm

posted on 2005-01-15 01:28 birdshome 阅读(2896) 评论(6) 编辑 收藏

评论

#1楼  回复 引用 查看   

强人
2005-01-15 09:42 | BillChen      

#2楼  回复 引用   

对于Unicode编码的字符,类似©编码解码有错,用你的脚本解码后得到的结果是"?"。
2005-01-17 11:06 | base65

#3楼[楼主]  回复 引用 查看   

这个问题我查了一下,VBScript里的Asc函数把"©"返回为了63,所以我使用Chr解码自然就只能得到"?",这个bug还真是难办:(
2005-01-18 14:33 | birdshome      

#4楼  回复 引用   

好东东!
可是无法在firefox下运行,楼主能不能全部用Javascript来写呢?
2006-02-23 13:29 | yeahoo[未注册用户]

#5楼[楼主]  回复 引用 查看   

@yeahoo
VbScript是不能运行在firefox下的,所以我也没有办法只写成javascript。
2006-02-23 14:20 | birdshome      

#6楼  回复 引用   

真是麻烦吖,JS中没有asc这个函数,如实在要全部写成JS的话,恐怕要用查表法了吧,gb2312.txt 这个文件这么大.

实在没有办法了吗?
2006-02-26 04:42 | nameless[未注册用户]

导航

公告

  原创技术文章和心得,转载必须注明来源"博客园"!
  贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:birdshome
园龄:7年10个月
荣誉:推荐博客
粉丝:73
关注:3

搜索

 

常用链接

我的标签

随笔分类(337)

文章分类(147)

相册

Ex-Colleagues

常用链接

兄弟情深

积分与排名

  • 积分 - 3145044
  • 排名 - 6

最新评论

阅读排行榜

推荐排行榜