我正在尝试在针对Flash(而不是AIR)的AS3中实现一些安全机制。我想获得我的代码运行的swf的实际二进制内容(作为ByteArray)。
如果我查看stage.loaderInfo.bytesTotal
,它正确包含swf文件的长度;我期望stage.loaderInfo.bytes
包含实际内容,但是这个ByteArray比swf本身要大得多,所以
非常感谢!
答案 0 :(得分:2)
我的猜测是stage.loaderInfo.bytes
包含未压缩的SWF数据。在大多数SWF中,前几个字节左右包含一些未压缩的二进制数据,其余的SWF被压缩。有关详细信息,请参阅spec。我希望bytes
包含这个未压缩的头数据,然后是其余的SWF数据,现在解压缩。
作为旁注,bytesTotal
为您提供压缩长度,这就是为什么它会显示您期望的值。
重建压缩SWF的一种可能方法是使用适当的算法从bytes
压缩部分数据,该算法实际上由SWF的第一个字节指示。您需要什么实际数据?
答案 1 :(得分:0)
我们在Flash中的IO范围仍然有限;引用“Loader”或更具体的“root”概念(您仍然可以使用) - 这只是假设您的二进制数据对象可以在页面级别接受SWF。你好像在寻找关于Flash如何解析Byte Arrays的1-2。
这是一个很长的话题,并且[在我看来]已被过度讨论,但由于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
});
}
}
}