2013-07-16 38 views
1

我試圖在AS3中實現一些針對Flash(不是AIR)的安全機制。我想獲得我的代碼運行的swf的實際二進制內容(作爲ByteArray)。 如果我查看stage.loaderInfo.bytesTotal,它正確包含swf文件的長度;我期待stage.loaderInfo.bytes包含實際的內容,但此ByteArray比SWF本身大得多,所以從swf獲取swf的字節

  • 什麼stage.loaderInfo.bytes實際上包含哪些內容? (該文件是根本不明確的)
  • 有沒有一種方法來獲取swf的字節,因爲我需要? (除了通過URLLoader重新加載swf)

非常感謝!

回答

2

我的猜測是stage.loaderInfo.bytes包含未壓縮的SWF數據。在大多數SWF中,前幾個字節左右包含一些未壓縮的二進制數據,而其餘的SWF則是壓縮的。你可以參考spec瞭解更多信息。我期望bytes將包含這個未壓縮的頭數據,其後是現在解壓縮的其餘SWF數據。

作爲旁註,bytesTotal爲您提供了壓縮長度,這就是爲什麼它會顯示您期望的值。

重建壓縮的SWF的一種可能方式是用適當的算法壓縮來自bytes的部分數據,該算法實際上由SWF的第一個字節指示。你需要什麼實際數據?

+0

好猜,我只是發現swf通常是ZLIB'ed。 我的需求是驗證swf的內容沒有被更改,並且必須從swf中進行檢查。但知道字節是壓縮的,我只需在創建引用之前解壓縮它們。 – ThomasWeiss

+0

是的,似乎應該工作。如果您使用Flex進行編譯,我知道編譯器有壓縮選項(請參閱http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7a92.html)。我猜想,無論你用什麼方法編譯你的SWF文件,都會有類似的內容,對你來說可能是有用的 – user1103976

0

我們在Flash中的IO範圍仍然有限;引用「Loader」或更具體的「根」(您仍然可以使用)的想法 - 這隻會假設您的二進制數據對象可以在頁級別加載SWF。你似乎更多地關注Flash解析字節數組的方式。

這是一個很長的話題,並且已經被過度討論了[在我看來],但是由於Flash使用AMF並從任何主機實例化海關對象,所以有一大組可用的Native AS 3.0(不支持AIR或需要Flex) - 可用於讀取,寫入和編碼二進制文件。

下面是一個例子類我寫的不是很久以前的JR開發誰需要的系列化如何在AS 3.0快速瞭解 - 我希望它能幫助:

 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

謝謝你的例子。順便說一句,在AS3的世界裏,詳細的是成爲一個更好的編碼器。現在已經不是256KB內存的日子了。 –