使用混合脚本编程来实现的Base64解码
2005-01-15 01:28
519 查看
前几天用脚本做了个Base64编码程序,今天把解码程序也实现了,不过同样是使用JScript和VBScript混合编程来搞定的。
解码的过程和编码过程是基本相同的,代码如下:
</script> </script> </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
解码的过程和编码过程是基本相同的,代码如下:
</script> </script> </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
相关文章推荐
- 使用混合脚本编程来实现的Base64编码
- 使用 T-SQL 实现 base64 解码
- 使用 T-SQL 实现 base64 解码
- JAVA加密算法使用——Base64编程使用(sun和cc)实现编解码工具类
- 使用NDK实现的Base64编/解码
- 使用 T-SQL 实现 base64 解码
- 用C#实现Base64处理,加密解密,编码解码
- Base64 编解码C语言实现
- Base64在线编码解码实现代码 演示与下载
- 使用Google的ZXing库实现编解码二维码
- 基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
- 用XMLDOM和ADODB.Stream实现base64编码解码实现代码
- C#实现Base64编码与解码
- linux下使用libmad库实现mp3文件的解码、播放
- Python简单实现Base64编码和解码的方法
- 第九课,使用混合来实现半透明效果
- Base64编辑解码的使用
- base64编码、解码的C语言实现
- 【Unity Shaders】使用Unity Render Textures实现画面特效——画面特效中的相似Photoshop的基本混合模式
- Base64编码、解码的实现