About wpm

  • Website: or email
  • Biography:

Posts by wpm:

 
-

AS3的Base64编码和解码

on Aug 26, 2011 in ActionScript, Articles, Flash, Tutorials

最近要做一个将flash截的图传给js显示的功能,然后需要解决将图片数据转换成Base64编码格式,同事帮忙在网上找到了这个很有用的Base64编码和解码的类。很好用。记录一下。

参考链接:http://www.cordyblog.cn/?action=show&id=49

调用代码:

import com.dynamicflash.utils.Base64;
//编码和解码字符串
var source:String = "Hello, world";
var encoded:String = Base64.encode(source);
trace(encoded);
var decoded:String = Base64.decode(encoded);
trace(decoded);
//编码和解码ByteArray
var obj:Object= {name:"Dynamic Flash",url:"http://dynamicflash.com"};
var source:ByteArray = new ByteArray();
source.writeObject(obj);
var encoded:String = Base64.encodeByteArray(source);
trace(encoded);
var decoded:ByteArray = Base64.decodeToByteArray(encoded);
obj = decoded.readObject();
trace(obj.name + "(" + obj.url + ")");

Base64类代码:

package com.dynamicflash.util{   

    import flash.utils.ByteArray;   

    public class Base64 {   

        private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";   

        public static const version:String = "1.0.0";   

        public static function encode(data:String):String {
            // Convert string to ByteArray
            var bytes:ByteArray = new ByteArray();
            bytes.writeUTFBytes(data);   

            // Return encoded ByteArray
            return encodeByteArray(bytes);
        }   

        public static function encodeByteArray(data:ByteArray):String {
            // Initialise output
            var output:String = "";   

            // Create data and output buffers
            var dataBuffer:Array;
            var outputBuffer:Array = new Array(4);   

            // Rewind ByteArray
            data.position = 0;   

            // while there are still bytes to be processed
            while (data.bytesAvailable > 0) {
                // Create new data buffer and populate next 3 bytes from data
                dataBuffer = new Array();
                for (var i:uint = 0; i < 3 && data.bytesAvailable > 0; i++) {
                    dataBuffer[i] = data.readUnsignedByte();
                }   

                // Convert to data buffer Base64 character positions and
                // store in output buffer
                outputBuffer[0] = (dataBuffer[0] & 0xfc) >> 2;
                outputBuffer[1] = ((dataBuffer[0] & 0x03) << 4) | ((dataBuffer[1]) >> 4);
                outputBuffer[2] = ((dataBuffer[1] & 0x0f) << 2) | ((dataBuffer[2]) >> 6);
                outputBuffer[3] = dataBuffer[2] & 0x3f;   

                // If data buffer was short (i.e not 3 characters) then set
                // end character indexes in data buffer to index of '=' symbol.
                // This is necessary because Base64 data is always a multiple of
                // 4 bytes and is basses with '=' symbols.
                for (var j:uint = dataBuffer.length; j < 3; j++) {
                    outputBuffer[j + 1] = 64;
                }   

                // Loop through output buffer and add Base64 characters to
                // encoded data string for each character.
                for (var k:uint = 0; k < outputBuffer.length; k++) {
                    output += BASE64_CHARS.charAt(outputBuffer[k]);
                }
            }   

            // Return encoded data
            return output;
        }   

        public static function decode(data:String):String {
            // Decode data to ByteArray
            var bytes:ByteArray = decodeToByteArray(data);   

            // Convert to string and return
            return bytes.readUTFBytes(bytes.length);
        }   

        public static function decodeToByteArray(data:String):ByteArray {
            // Initialise output ByteArray for decoded data
            var output:ByteArray = new ByteArray();   

            // Create data and output buffers
            var dataBuffer:Array = new Array(4);
            var outputBuffer:Array = new Array(3);   

            // While there are data bytes left to be processed
            for (var i:uint = 0; i < data.length; i += 4) {
                // Populate data buffer with position of Base64 characters for
                // next 4 bytes from encoded data
                for (var j:uint = 0; j < 4 && i + j < data.length; j++) {
                    dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j));
                }   

                // Decode data buffer back into bytes
                outputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 0x30) >> 4);
                outputBuffer[1] = ((dataBuffer[1] & 0x0f) << 4) + ((dataBuffer[2] & 0x3c) >> 2);
                outputBuffer[2] = ((dataBuffer[2] & 0x03) << 6) + dataBuffer[3];   

                // Add all non-padded bytes in output buffer to decoded data
                for (var k:uint = 0; k < outputBuffer.length; k++) {
                    if (dataBuffer[k+1] == 64) break;
                    output.writeByte(outputBuffer[k]);
                }
            }   

            // Rewind decoded data ByteArray
            output.position = 0;   

            // Return decoded data
            return output;
        }   

        public function Base64() {
            throw new Error("Base64 class is static container only");
        }
    }
}

Tags: ,

 
-

unload

on Aug 24, 2011 in Uncategorized

http://gskinner.com/blog/archives/2008/04/failure_to_unlo.html

 
5

Flash Debug Player引起Firefox 3.6崩溃的解决办法

on Jul 28, 2011 in Articles, Flash

调试Flash的时候,只要有异常,弹出异常窗口以后,Firefox就不响应了,过一会会显示Flash插件崩溃的信息,只能通过任务管理器强行关闭Firefox。 解决方案如下: 1. Firefox地址栏输入about:config,打开高级设置,如果有警告直接忽略 2. 在Filter里搜索dom.ipc.plugins 3. 双击dom.ipc.plugins.enabled.npswf32.dll设为false 4. 也可以把dom.ipc.plugins.timeoutSecs设为-1来禁用插件崩溃的timeout 5. 重启Firefox

 
5

谷歌账户无法登陆,网络连接失败的解决方法

on Jun 28, 2011 in Articles, Tutorials

谷歌账户无法登陆,网络连接失败的解决方法

 
1

win7下不能正常卸载air的解决方法

on Jun 27, 2011 in AIR, Articles

以前在win7下装了个air,后来不知咋整的,怎么也卸载不了,更新也更新不了,没辙,只好想了个暴力卸载的招。 1.找到其安装目录:C:\Program Files\Common Files\Adobe AIR 删除整个文档,如果你怕有问题,可以先备份下。 如果删除时提示被其他程序占用,可以使用附件->系统工具->资源监视器,在CPU选项卡的关联句柄中搜索adobe air,就可以找到是哪个进程占用了,然后右键结束。 2.删除所有adobe air相关的注册表信息,如果怕删错,可以先备份一下注册表。 3.安装新的adobe air程序即可。

 
2

FLASHDEVELOP配置(转)

FLASHDEVELOP配置,常用的一些配置方法及参数。

 
1

Flash XMLSocket 通信问题总结(转)

on Mar 28, 2011 in ActionScript, Articles, Flash, Flex, Tutorials

Flash XMLSocket 通信问题总结 1、前言 本文以标准两层 C/S 架构为例,对 XMLSocket 通信编程作一沉痛总结。 从开始到调试正常耗掉了我几乎一周的时间,故为沉痛!尚东!!真是太尚东了!!!   为方便描述,把 Flash Player 称作客户端(Client),包括独立的 Player 和嵌入浏览器的 Player。 2、用途 XMLSocket 类提供以 TCP/IP 方式进行程序间通讯的功能。 3、开发基本流程 流程无所谓,先做服务端也好,先做客户端也罢,都不可能把一边做完再做另一边,总之是要同步进行,除非服务端已经存在。 4、客户端开发 XMLSocket 类使用比较简单,基本上就是几个步骤:   1) 创建 XMLSocket 类的实例。 2) 写好需要响应的事件代码,事件很少,如下: onConnect: Socket 成功连接后触发,传入一个参数,指定连接状态 onClose: 服务器端断开 Socket 后触发 onData: 收到服务端数据,或传输错误时触发,传入一个参数,为 undefined 时表示传输错误,否则为收到的数据 onXML: 收到服务端 XML 内容,或传输错误时触发,参数同 onData     典型的代码片段如下: … var g_Socket = new [...]

 
-

error while loading initial content的解决方案(转)

on Mar 28, 2011 in AIR, ActionScript, Flex, Tutorials

现在国内的flash builder4能学习的源码很少.E文是相对一部分人来说的.所以还有不少人在使用FLEX3的源码来学习研究.有人会在开始用flash builder4时碰到以下这个问题.其实解决方法跟以前FLEX3一样. 举例: 导入一个完整的Flex3源码进Flash Builder4里,准备调试看效果.其中出现如下窗口 ——————————————————————– Process terminated without establishing connection to debugger. Command: “C:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\bin\adl.exe” C:\adobeFlexTraining\flex3test\search\bin-debug\downloader-app.xml C:\adobeFlexTraining\flex3test\search\bin-debug Output from command: error while loading initial content ———————————————————————- 解决方法: 打开 downloader-app.xml 配置文件 将Application 修改为下面的一行, 重新编译保存. 对应版本 flex sdk 3.0.0的改成 1.0 flex sdk 3.2 的改成 1.5 flex sdk 4.0 的改成 1.5.3 以后的版本也是同样方法. 出自:http://perusal2008.blogbus.com/logs/49397110.html

 
1

AS3——navigateToURL(转)

on Mar 7, 2011 in ActionScript, Flash

navigateToURL() 可以用来打开一个新的浏览器窗口,也可以用来flex和js之间的通信,比如打开一个新窗口: var url:URLRequest = new URLRequest(“http://www.eb163.com”); navigateToURL(url, ”_blank”); 这个函数也可以用来执行js,例如: var url:URLRequest = new URLRequest(“javascript:window.close()”); 或者: var urlLURLRequest = new URLRequest(“javascript:myFun(para1…paran)”) myFun()函数是html页面的script部分定义的,函数参数一定要有引号! navigateToURL(url, ”_self”); 也可以用来发送email: var urlURLRequest = new URLRequest(“mailto:55555@163.com”); navigateToURL(url, ”_blank”); 阻止navigateToURL弹窗的解决方法: package FlashCode.utils{ import flash.display.Sprite; import flash.net.URLRequest; import flash.net.navigateToURL; import flash.external.ExternalInterface; public class openWindow { public function openWindow(url:String, window:String=”_blank”, features:String=”"){ var WINDOW_OPEN_FUNCTION:String = ”window.open”; var myURL:URLRequest = new URLRequest(url); var browserName:String = getBrowserName(); if(getBrowserName() == ”Firefox”){ ExternalInterface.call(WINDOW_OPEN_FUNCTION, url, window, features); } //If IE, else if(browserName == ”IE”){ ExternalInterface.call(WINDOW_OPEN_FUNCTION, url, window, features); //ExternalInterface.call(“function setWMWindow() {window.open(&apos;” + url + ”&apos;);}”); } //If Safari else if(browserName == ”Safari”){ navigateToURL(myURL, window); } //If Opera else if(browserName == ”Opera”){ navigateToURL(myURL, window); } else { navigateToURL(myURL, window); } /*Alternate methodology… var popSuccess:Boolean = ExternalInterface.call(WINDOW_OPEN_FUNCTION, url, window, features); if(popSuccess == false){ navigateToURL(myURL, window); }*/ } private function getBrowserName():String{ var browser:String; //Uses external interface to reach out to browser and grab browser useragent info. var browserAgent:String = ExternalInterface.call(“function getBrowser(){return navigator.userAgent;}”); //  Debug.text += ”Browser Info: [" + browserAgent + "]“; //Determines brand of browser using a find index. If not found indexOf returns (-1). if(browserAgent != null && browserAgent.indexOf(“Firefox”) >= 0) { [...]

 
-

跨域资源共享的10种方式(转)

on Feb 14, 2011 in ActionScript, Articles, Flash

http://www.woiweb.net/10-cross-domain-methods.html 在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢? 同源策略 在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.example.org),那么我们就可以认为它们是相同的域。比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的html文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。 受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式,以下跨域实例的源代码可以从这里获得。 单向跨域 JSONP JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。 flash URLLoader flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域www.a.com请求域www.b.com上的数据,我们可以借助Flash来发送HTTP请求。首先,修改域www.b.com上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建) ,把www.a.com加入到白名单。其次,通过Flash URLLoader发送HTTP请求,最后,通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。 Access Control Access Control是比较超越的跨域方式,目前只在很少的浏览器中得以支持,这些浏览器可以发送一个跨域的HTTP请求(Firefox, Google Chrome等通过XMLHTTPRequest实现,IE8下通过XDomainRequest实现),请求的响应必须包含一个Access-Control-Allow-Origin的HTTP响应头,该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的asset.php发送了一个跨域的HTTP请求,那么asset.php必须加入如下的响应头: header(“Access-Control-Allow-Origin: http://www.a.com”); window.name window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。 server proxy 在数据提供方没有提供对JSONP协议或者window.name协议的支持,也没有对其它域开放访问权限时,我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时,直接发送一个指向www.b.com/asset.txt的Ajax请求肯定是会被浏览器阻止。这时,我们在www.a.com下配一个代理,然后把Ajax请求绑定到这个代理路径下,例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt,跨域的HTTP请求是在服务器端进行的,客户端并没有产生跨域的Ajax请求。这个跨域方式不需要和目标资源签订协议,带有侵略性,另外需要注意的是实践中应该对这个代理实施一定程度的保护,比如限制他人使用或者使用频率。 双向跨域 document.domain 通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的method来通信了。 FIM – Fragment Identitier Messaging 不同的域之间,JavaScript只能做很有限的访问和操作,其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment Identitier Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为frag,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带frag,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他window的location来发送消息,并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,URL在浏览器下有长度限制,这个制约了每次传送的数据量。 Flash LocalConnection 页面上的双向通信也可以通过Flash来解决,Flash API中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的Flash Player或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且需要了2个SWF文件,实用性不强。 [...]