1

Flash (AIR ではない) を対象とする AS3 にセキュリティ メカニズムを実装しようとしています。コードが実行されている swf の実際のバイナリ コンテンツを (ByteArray として) 取得したいと考えています。 を見るとstage.loaderInfo.bytesTotal、swf ファイルの長さが正しく含まれています。実際のコンテンツが含まれていることを期待stage.loaderInfo.bytesしていましたが、この ByteArray は swf 自体よりもはるかに大きいため、

  • stage.loaderInfo.bytes には実際に何が含まれていますか? (ドキュメントはまったく明示的ではありません)
  • 必要に応じて swf のバイトを取得する方法はありますか? (URLLoader を介して swf を再ロードする以外)

どうもありがとう!

4

2 に答える 2

0

Flash での IO の範囲はまだ限られています。「ローダー」への参照、またはより具体的な「ルート」の概念への参照 (引き続き使用できます) - これは、バイナリ データ オブジェクトがページ レベルで SWF にアクセス可能であることを前提としています。Flashがバイト配列を解析する方法について、1-2をもっと探しているようです。

これは長い話題であり、[私の意見では] 議論されすぎていますが、Flash は AMF を使用し、任意のホストからカスタム オブジェクトをインスタンス化するため、Native AS 3.0 である利用可能なクラスの大きなセットがあります (AIR や Flex は必要ありません)。 - バイナリの読み取り、書き込み、およびエンコードに使用できます。

以下は、AS 3.0 でシリアライゼーションがどのように機能するかを簡単に理解する必要がある Jr 開発者のために、少し前に私が書いたクラスの例です。

     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 
                  });
      }  
  } 
  }
于 2013-07-16T10:23:32.287 に答える