首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从swf中获取swf的字节

从swf中获取swf的字节
EN

Stack Overflow用户
提问于 2013-07-16 05:56:15
回答 2查看 1.3K关注 0票数 1

我试图在AS3中实现一些针对Flash (而不是AIR)的安全机制。我希望获得我的代码正在运行的swf的实际二进制内容(作为ByteArray)。如果我查看stage.loaderInfo.bytesTotal,它正确地包含了swf文件的长度;我希望stage.loaderInfo.bytes包含实际的内容,但是这个ByteArray比swf本身要大得多,所以

  • stage.loaderInfo.bytes实际上包含什么?(文档一点也不明确)
  • 有没有办法像我所需要的那样得到swf的字节?(通过URLLoader重新加载swf除外)

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 06:35:47

我猜stage.loaderInfo.bytes包含未压缩的SWF数据。在大多数SWF中,最初的几个字节包含一些未压缩的二进制数据,其余的SWF被压缩。有关这方面的更多信息,可以参考等级库。我预计bytes将包含这个未压缩的头数据,接下来是现在解压缩的SWF数据的其余部分。

作为一个侧面,bytesTotal为您提供压缩长度,这就是为什么它显示您期望的值。

重构压缩SWF的一种可能方法是使用适当的算法压缩来自bytes的部分数据,这实际上是由SWF的第一个字节表示的。你需要实际数据做什么?

票数 2
EN

Stack Overflow用户

发布于 2013-07-16 10:23:32

对于Flash中的IO,我们仍然有有限的范围;对"Loader“的引用,或者更特定于"root”的概念(您仍然可以使用)--这只是假设您的二进制数据对象可以在页面级别访问SWF。你似乎在寻找更多关于Flash如何解析Byte数组的1-2版本。

这是一个很长的话题,在我看来已经被过度讨论过了,但是由于Flash使用AMF并从任何主机实例化海关对象,有大量的类可以作为3.0 (不需要AIR或Flex )使用,可以用于读取、写入和编码二进制文件。

下面是我不久前为Jr开发人员编写的一个示例类,他需要快速了解序列化在3.0中是如何工作的--我希望它能有所帮助:

代码语言:javascript
复制
     package {
         import flash.display.*; 
         import flash.net.*; 
         import flash.events.*;
         import flash.utils.*;

         public class loadAndRead extends EventDispatcher {
              private var ldr:Loader;
              private var urq:URLRequest;
              private var iba:ByteArray; 
              private var swf:String;
              private var obj:*;
        function loadAndRead() {
              ldr = new Loader();
              urq = new URLRequest(swf = 'anyswfanywhere.swf');
        }
        public function rd(d:*):void { 
              obj = d;
              iba = obj['BTS'] as ByteArray() || ByteArray(obj['BTS']); 
              iba.uncompress()
              iba.deflate();
              iba.readUTFBytes();
              iba.position       = 0;
              iba.uncompress(); 
              iba.position       = 0;
              for each (var n:* in i.readObject())
                        {
                         if(n){trace(i.readObject()['n']+": "+n)
                        }
               }  
        } 
        private function getSWF():void {
            ldr.load(urq); 
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, ogs); 
        }
        private function ogs(w:Event):void { 
        rd({L: ldr.contentLoaderInfo.bytes.length,
            A: ldr.contentLoaderInfo.bytes.bytesAvailable,
            T: ldr.contentLoaderInfo.contentType,
                    U: ldr.contentLoaderInfo.loaderURL, 
                   BA: ldr.contentLoaderInfo.bytes.readUTF(), 
                  BTS: ldr.contentLoaderInfo.bytes 
                  });
      }  
  } 
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17669034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档