放假前, 有个应用需要对web页的一部分内容base64编码发到服务器保存, 这个功能本来不难, 不过那要上传的内容有3、40K, 还要必需支持杯具的IE6...代码写出来后,在IE6上一跑,果然杯具,要一分多钟才转完~当时有个想法,利用flash来做Base64运算核心,但因某些原因没有去做,现在新的一年快来了,不去试一下老感到不舒服,所以就在今年的最后时刻把这事做了,有始有终~
以下是actionscript3代码,由于flex里有base64的工具,直接拿来用了,另外要处理中文编码问题,所以按js那边的方式加了个_utf8_encode和_utf8_decode函数。
import flash.external.ExternalInterface;
import mx.events.FlexEvent;
import mx.utils.Base64Decoder;
import mx.utils.Base64Encoder;
protected function application1_applicationCompleteHandler(event:flash.events.Event):void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("encode", base64encode);
ExternalInterface.addCallback("decode", base64decode);
}
}
protected function base64encode(input:String):String {
var encoder:Base64Encoder=new Base64Encoder();
encoder.encodeBytes(_utf8_encode(input));
return encoder.toString();
}
protected function base64decode(input:String):String {
var decoder:Base64Decoder=new Base64Decoder();
decoder.decode(input);
var ba:ByteArray=decoder.toByteArray();
return _utf8_decode(ba.toString());
}
protected function _utf8_encode(string:String):ByteArray {
string=string.replace(/\r\n/g, "\n");
var ba:ByteArray=new ByteArray();
for (var n:int=0; n < string.length; n++) {
var c:Number=string.charCodeAt(n);
if (c < 128) {
ba.writeUTFBytes(String.fromCharCode(c));
} else if ((c > 127) && (c < 2048)) {
ba.writeUTFBytes(String.fromCharCode((c >> 6) | 192));
ba.writeUTFBytes(String.fromCharCode((c & 63) | 128));
} else {
ba.writeUTFBytes(String.fromCharCode((c >> 12) | 224));
ba.writeUTFBytes(String.fromCharCode(((c >> 6) & 63) | 128));
ba.writeUTFBytes(String.fromCharCode((c & 63) | 128));
}
}
return ba;
}
protected function _utf8_encode_str(string:String):String {
string=string.replace(/\r\n/g, "\n");
var utftext:String="";
for (var n:int=0; n < string.length; n++) {
var c:Number=string.charCodeAt(n);
if (c < 128) {
utftext+=String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
utftext+=String.fromCharCode((c >> 6) | 192);
utftext+=String.fromCharCode((c & 63) | 128);
} else {
utftext+=String.fromCharCode((c >> 12) | 224);
utftext+=String.fromCharCode(((c >> 6) & 63) | 128);
utftext+=String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
protected function _utf8_decode(utftext:String):String {
var string:String="";
var i:Number=0;
var c:Number=0, c1:Number=0, c2:Number=0, c3:Number=0;
while (i < utftext.length) {
c=utftext.charCodeAt(i);
if (c < 128) {
string+=String.fromCharCode(c);
i++;
} else if ((c > 191) && (c < 224)) {
c2=utftext.charCodeAt(i + 1);
string+=String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i+=2;
} else {
c2=utftext.charCodeAt(i + 1);
c3=utftext.charCodeAt(i + 2);
string+=String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i+=3;
}
}
return string;
}
以下为js调用代码
$(function() {
setTimeout(function() {
var str = [];
for(var i=0; i<10000; i++){
str.push('新年快乐');
}
var obj = $('#Base64')[0];
var s = str.join('');
var d1 = (new Date()).getTime();
var ss = obj.decode(obj.encode(s));
// 用于纯js实现对比
// var ss = Base64.decode(Base64.encode(s));
var d2 = (new Date()).getTime();
alert(d2-d1);
alert(ss);
}, 2000);
});
当然,大家最关心的还是结果,
IE6:JS:91359ms
AS:625ms
IE9:JS:125ms~281ms(不知道为什么那么浮动)
AS:587ms
chrome 10:JS:63ms
AS:349ms
从测试结果上看。。。对于必须支持IE6的应用,用flash加速的效果还是相当可观的,如果只需支持现代浏览器的话,JS是个更好的选择,至少目前是。。。最后,我们来祈祷不用支持IE6~
分享到:
相关推荐
flash avm2 虚拟机说明,DOABC解析
公司内部的ppt,大致介绍了flash的文件格式和AVM运行原理
swf文件结构及avm原理 对理解flash及其运行具有一定的指导意义, 真正理解flash 的swf文件里面存储的内容,以及 avm如何更具这些内容来运行swf程序
flash的虚拟机源码-AVM2 avmplus Adobe System Incorporated
惊喜!!Flash开源时代降临!AVM2所有源代码将作为Mozilla的开源项;这也给喜欢adobe的朋友们研究AVM2提供了可能,还等什么,赶快去下载吧
Actionscript Virtual Machine avm2
PIAB 真空泵P6010AVM 选型册pdf,PIAB 真空泵P6010AVM 选型册
计数问题 AVM竞赛练习 C语言 基础算法
高级验证方法学(AVM)中文版,做verification很好的学习资料,pdf格式,适于阅读
士研电机保护继电器AVM-NB说明书pdf,士研电机保护继电器AVM-NB说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±29%,如果电压超过或是不足,内部继电器立即回到原始...
New deployment of FortiGate for VMware FGT_VM64-v6.4.9-build1966-FORTINET.out.ovf.zip (64.37 MB)
MCIMX255AVM4
idea64.exe.vmoptions
士研电机保护继电器AVM-N说明书pdf,士研电机保护继电器AVM-N说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±20%,如果电压超过或是不足,内部继电器立即回到原始...
FLASH-AVM 的目的是为 yt python 包 ( https://yt-project.org/docs/dev/index.html ) 提供基于 Matlab 的替代方案,能够生成体积数据的高质量可视化。 该工具包允许用户读取和写入多维、多块、自适应网格细化 (AMR...
剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理
Ax86_8.1-R2-VM-64bit,android x86 64bit 8.1-r2 vmware 虚拟机,解压后,使用vmware15(至少)新建虚拟机,选择其他 64位-》在导入硬盘处选择此vmdk文件。
FGT_VM64-v7.0.5-build0304-FORTINET.out.ovf、vmware学习模拟器 FGT_VM64-v7.0.5-build0304-FORTINET.out.ovf FGT_VM64-v7.0.5-build0304-FORTINET.out.vmware
介绍AVM开发中的一些信息,用于系统工程师开发
AVM2源码.zip