使用方法在注释中
/*
* ForcibleLoader
*
* Licensed under the MIT License
*
* Copyright (c) 2007-2009 BeInteractive! (www.be-interactive.org) and
* Spark project (www.libspark.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
package
{
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.utils.Endian;
import flash.errors.EOFError;
/**
* Loads a SWF file as version 9 format forcibly even if version is under 9.
*
* Usage:
* <pre>
* var loader:Loader = Loader(addChild(new Loader()));
* var fLoader:ForcibleLoader = new ForcibleLoader(loader);
* fLoader.load(new URLRequest('swf7.swf'));
* </pre>
*
* @author yossy:beinteractive
* @see http://www.be-interactive.org/?itemid=250
* @see http://fladdict.net/blog/2007/05/avm2avm1swf.html
*/
public class ForcibleLoader
{
public function ForcibleLoader(loader:Loader)
{
this.loader = loader;
_stream = new URLStream();
_stream.addEventListener(Event.COMPLETE, completeHandler);
_stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
_stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
}
private var _loader:Loader;
private var _stream:URLStream;
public function get loader():Loader
{
return _loader;
}
public function set loader(value:Loader):void
{
_loader = value;
}
public function load(request:URLRequest):void
{
_stream.load(request);
}
private function completeHandler(event:Event):void
{
var inputBytes:ByteArray = new ByteArray();
_stream.readBytes(inputBytes);
_stream.close();
inputBytes.endian = Endian.LITTLE_ENDIAN;
if (isCompressed(inputBytes)) {
uncompress(inputBytes);
}
var version:uint = uint(inputBytes[3]);
if (version < 9) {
updateVersion(inputBytes, 9);
}
if (version > 7) {
flagSWF9Bit(inputBytes);
}
else {
insertFileAttributesTag(inputBytes);
}
loader.loadBytes(inputBytes);
}
private function isCompressed(bytes:ByteArray):Boolean
{
return bytes[0] == 0x43;
}
private function uncompress(bytes:ByteArray):void
{
var cBytes:ByteArray = new ByteArray();
cBytes.writeBytes(bytes, 8);
bytes.length = 8;
bytes.position = 8;
cBytes.uncompress();
bytes.writeBytes(cBytes);
bytes[0] = 0x46;
cBytes.length = 0;
}
private function getBodyPosition(bytes:ByteArray):uint
{
var result:uint = 0;
result += 3; // FWS/CWS
result += 1; // version(byte)
result += 4; // length(32bit-uint)
var rectNBits:uint = bytes[result] >>> 3;
result += (5 + rectNBits * 4) / 8; // stage(rect)
result += 2;
result += 1; // frameRate(byte)
result += 2; // totalFrames(16bit-uint)
return result;
}
private function findFileAttributesPosition(offset:uint, bytes:ByteArray):uint
{
bytes.position = offset;
try {
for (;;) {
var byte:uint = bytes.readShort();
var tag:uint = byte >>> 6;
if (tag == 69) {
return bytes.position - 2;
}
var length:uint = byte & 0x3f;
if (length == 0x3f) {
length = bytes.readInt();
}
bytes.position += length;
}
}
catch (e:EOFError) {
}
return NaN;
}
private function flagSWF9Bit(bytes:ByteArray):void
{
var pos:uint = findFileAttributesPosition(getBodyPosition(bytes), bytes);
if (!isNaN(pos)) {
bytes[pos + 2] |= 0x08;
}
}
private function insertFileAttributesTag(bytes:ByteArray):void
{
var pos:uint = getBodyPosition(bytes);
var afterBytes:ByteArray = new ByteArray();
afterBytes.writeBytes(bytes, pos);
bytes.length = pos;
bytes.position = pos;
bytes.writeByte(0x44);
bytes.writeByte(0x11);
bytes.writeByte(0x08);
bytes.writeByte(0x00);
bytes.writeByte(0x00);
bytes.writeByte(0x00);
bytes.writeBytes(afterBytes);
afterBytes.length = 0;
}
private function updateVersion(bytes:ByteArray, version:uint):void
{
bytes[3] = version;
}
private function ioErrorHandler(event:IOErrorEvent):void
{
loader.contentLoaderInfo.dispatchEvent(event.clone());
}
private function securityErrorHandler(event:SecurityErrorEvent):void
{
loader.contentLoaderInfo.dispatchEvent(event.clone());
}
}
}
转自http://www.imemment.com/post/82.html
分享到:
相关推荐
`AVM1Movie_To_MovieClip`这个类很可能是作者为了弥补AS3原生不支持AMV1格式而编写的。这个类可能包含了读取AMV1视频数据、解码、并将每一帧转换为AS3中的BitmapData,然后利用DisplayObject容器的功能组合成...
相比于前一代的AVM1(主要针对AS1和AS2),AVM2在设计上有了显著改进,尤其是在性能方面。它采用了JIT(Just-In-Time)编译技术与解释器相结合的方式,这种混合执行模式极大地提高了代码执行效率。 #### JIT与解释...
AVM有两种版本:AVM1和AVM2,其中AVM2是更为先进的一种,支持ActionScript 3.0。 1. **AVM2架构** - **ABCLoad**:加载ABC(ActionScript ByteCode)数据到内存,并进行解析,获取所有数据单元,如Script、Class、...
随着技术的发展,AVM经历了从AVM1到AVM2的重大升级,以支持更强大的功能和性能提升。AVM2的开源使得开发者和研究人员有机会深入理解其内部工作原理,对ActionScript的优化和自定义实现提供了无限可能。 AVM2的设计...
综合以上信息,这个项目可能是一个使用ActionScript或相关的编程语言(如AS3,因为AS2和AS1已被AVM1支持)编写的SWF播放器。它可能利用了Flex框架,因为有`.flexProperties`和`.actionScriptProperties`文件。开发...
AVM2是Adobe Flash Player和Adobe AIR的核心组件之一,旨在执行ActionScript 3.0(AS3)代码。它不仅提供了比前代AVM更高效的性能,还引入了对现代编程语言特性的支持,如垃圾回收、类型安全和多线程。 #### 重要...
本文主要介绍的是倍加福旗下的AVM58系列多圈绝对值编码器的相关资料,特别是AVM58-H型号的特点及应用。 #### 二、AVM58-H单圈绝对值编码器特点 AVM58-H是一款单圈绝对值编码器,通过SSI(同步串行接口)输出定位数据...
剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理
1. **AVM组件模型**:AVM定义了一组预定义的组件模板,如Agent、Driver、Sequencer、Monitor等,这些组件可以相互协作完成验证任务。书中会解释每个组件的作用和它们之间的交互机制。 2. **接口与连接**:AVM提供了...
AVM2 的出现是为了克服早期版本的ActionScript(如AS1和AS2)在性能和功能上的限制。 #### 二、ActionScript Virtual Machine 结构 ##### 2.1 常量值 AVM2 使用一系列预定义的常量值来帮助解释和执行脚本。这些...
在构建AVM系统中,我们可以选择适合的型号,如PIC16或PIC18系列,它们拥有足够的输入/输出引脚和计算能力,可以处理实时的数据采集和处理任务。 三、AVM系统硬件设计 1. 电流测量:采用电流互感器或分流器来感应...
1. **字节码解析**:AVM2使用字节码作为中间表示,这使得代码可以在不同的平台上运行。字节码解析器负责将二进制的字节码转换为可执行的指令。 2. **类加载机制**:AVM2管理着类的生命周期,包括加载、链接和初始化...
flash的虚拟机源码-AVM2 avmplus Adobe System Incorporated
从给定的文件信息来看,我们正在探讨的主题是“计数问题”,具体而言,这是一个与AVM(一种可能指的是Algorithm Visualization Media或者特定编程竞赛的缩写)竞赛练习相关的C语言基础算法实例。这个实例主要涉及在...
PIAB真空泵P6010AVM选型册介绍了PIAB公司推出的P6010AVM真空泵产品,该产品采用了专利的COAX®技术。COAX®技术是一种先进的真空产生技术,能够提供可靠的真空吸附力量和高效的气流控制,特别适合于需要大量大吸盘的...
- **ErlyJS**虽然没有直接展示代码,但我们可以推测其目标是将JavaScript代码转换为Erlang形式,以便在Erlang VM上运行。 【实现层面】 - **Reia**的代码首先被转换为Erlang形式,然后由Erlang编译器处理成BEAM...
3. **测试与回滚**:AVM允许你快速切换到不同的Ansible版本,进行回归测试,如果发现问题可以方便地回滚到之前的稳定版本。 4. **自动化部署**:AVM可以与CI/CD工具集成,自动升级或降级Ansible版本,以适应开发和...
同时,AVM系统也可以为基于图像的汽车电子技术提供基础平台,如车道偏离预警、行人防撞、汽车外环境三维建模等等。 AVM系统的工作原理是通过四个广角摄像头采集汽车周围的图像,然后通过图像处理技术将图像合并和...
士研电机保护继电器AVM-NB说明书pdf,士研电机保护继电器AVM-NB说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±29%,如果电压超过或是不足,内部继电器立即回到原始...