• 2009-06-03

    使用Base64 给 SWFKit 传递ByteArray - [SWFKit]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://25swf.blogbus.com/logs/40402067.html

    AS端只需要上网找一个Base64的类,而SWFKit 则需要对应转换一下 SWFKit 代码如下

     function Base64()
    {
     this.keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
     function readByte(input)
     {
       var ch = input.get();
       if (input.eof) return NaN;  
       return ch;
     }
     function encode(input)
       {
       var output = new StringStream;
       var chr1, chr2, chr3 ;
       var enc1, enc2, enc3, enc4;
       do
       {
        chr1 = this.readByte(input);
        chr2 = this.readByte(input);
        chr3 = this.readByte(input);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2))
        {
          enc3 = enc4 = 64;
        }
        else if (isNaN(chr3))
        {
          enc4 = 64;
        }
        output.write(this.keyStr.charAt(enc1) + this.keyStr.charAt(enc2) +
           this.keyStr.charAt(enc3) + this.keyStr.charAt(enc4));      
        } while (!input.eof);
        return output;
      }
      function decode(input)
       {
        var output = new StringStream;
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
       
        var base64test = new RegExp("[^A-Za-z0-9+/=]", "g");
        if (base64test.exec(input))
        {
          trace("Base64.decode: ", "invalid input string");
          return null;
        }
        do
        {
          enc1 = this.keyStr.indexOf(input.charAt(i++));
          enc2 = this.keyStr.indexOf(input.charAt(i++));
          enc3 = this.keyStr.indexOf(input.charAt(i++));
          enc4 = this.keyStr.indexOf(input.charAt(i++));
         
          chr1 = (enc1 << 2) | (enc2 >> 4);
          chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
          chr3 = ((enc3 & 3) << 6) | enc4;
         
          output.put(String.fromCharCode(chr1));
         
          if (enc3 != 64)
          {
           output.put(String.fromCharCode(chr2));
          }     
          if (enc4 != 64)
          {
           output.put(String.fromCharCode(chr3));
          }
        } while (i < input.length);
        return output;
     }
    }

    使用方法如下
    var converter = new Base64();
       var newStream = converter.decode(base64string);//base64string 是AS传过来的string

    有了这个方法,可以使用FLASH下载文件,然后传递给SWFKit 保存,对于做小文件的在线更新是很有用的.
    虽然SWFKit自带有下载文件的功能,但是,在文件下载完成之前.FLASH都处于中断状态,如果是想使用FLASH显示下载进度则是相当烦麻.使用SWFKit的自带更新呢,又无法十分方便的替换更新程序的样式.

    另外要注意的是,要控制 base64string 的大小,过大的 base64string 也会使FLASH长期处于中断状态.笔者建议使用Timer来分段写入.


    收藏到:Del.icio.us