我试图在AS3中实现一些针对Flash (而不是AIR)的安全机制。我希望获得我的代码正在运行的swf的实际二进制内容(作为ByteArray)。如果我查看stage.loaderInfo.bytesTotal,它正确地包含了swf文件的长度;我希望stage.loaderInfo.bytes包含实际的内容,但是这个ByteArray比swf本身要大得多,所以
非常感谢!
发布于 2013-07-16 06:35:47
我猜stage.loaderInfo.bytes包含未压缩的SWF数据。在大多数SWF中,最初的几个字节包含一些未压缩的二进制数据,其余的SWF被压缩。有关这方面的更多信息,可以参考等级库。我预计bytes将包含这个未压缩的头数据,接下来是现在解压缩的SWF数据的其余部分。
作为一个侧面,bytesTotal为您提供压缩长度,这就是为什么它显示您期望的值。
重构压缩SWF的一种可能方法是使用适当的算法压缩来自bytes的部分数据,这实际上是由SWF的第一个字节表示的。你需要实际数据做什么?
发布于 2013-07-16 10:23:32
对于Flash中的IO,我们仍然有有限的范围;对"Loader“的引用,或者更特定于"root”的概念(您仍然可以使用)--这只是假设您的二进制数据对象可以在页面级别访问SWF。你似乎在寻找更多关于Flash如何解析Byte数组的1-2版本。
这是一个很长的话题,在我看来已经被过度讨论过了,但是由于Flash使用AMF并从任何主机实例化海关对象,有大量的类可以作为3.0 (不需要AIR或Flex )使用,可以用于读取、写入和编码二进制文件。
下面是我不久前为Jr开发人员编写的一个示例类,他需要快速了解序列化在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
});
}
}
}https://stackoverflow.com/questions/17669034
复制相似问题