以前自己写编辑器的时候需要读取一个flash生成的swf文件 然后得到swf中的链接名字

就是这个样子,然后我从网上找了好多例子都没有很好的,最后用swf的文件结构实现了读取swf中链接的工具

今天有一个朋友也遇到了这个需求,处于方便写篇帖子,以后有需要的朋友都可以参考下

AnalysisSwf.as类

package

{   
import flash.display.ActionScriptVersion;
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.utils.Endian;

import flashx.textLayout.elements.InlineGraphicElement;

/**
*解析swf文件链接  
*@author 七公子_崛
*/
public class AnalysisSwf extends Sprite
{

private static var intance:AnalysisSwf;
public static function getInstance():AnalysisSwf{
if(!intance) intance = new AnalysisSwf();
return intance;
}
private var _swfByteArray:ByteArray = new ByteArray;

private const COMPRESSED:String = "CWS"; 
private var _swfSize:int; 
private var _frameRate:int; 
private var _frameTotal:int;

/***版本信息***/
private var _version:int;

/***swf中链接名字***/
private var _classList:Array;

/***解析完毕回调的方法***/
private var analysisCompleteFun:Function;

/***swf***/
private var swfMovieClip:MovieClip;
/***swf的在本机计算机上地址***/
private var swfPath:String;
/***用来加载swf***/
private var loader:Loader = new Loader();

public function AnalysisSwf()
{       
super();     
}

/**
* 开始解析swf文件
* @param _byte          swf二进制
* @param _fun           解析完毕回调方法
*/
public function startAnalysis(_byte:ByteArray,_fun:Function):void{

analysisCompleteFun = _fun;
var tempByteArray:ByteArray = _byte;
//是否 压缩  
var compressed:String = tempByteArray.readUTFBytes(3);

//swf 版本
_version = tempByteArray.readByte();

//
var length:uint = tempByteArray.readUnsignedInt();

tempByteArray.position = 8; 
tempByteArray.readBytes(_swfByteArray);

if(compressed == COMPRESSED)
{
_swfByteArray.uncompress(); 
}  
_swfByteArray.endian = Endian.LITTLE_ENDIAN;
// 解析 swf 宽度 高度 数据 rect 数据
_swfSize = _swfByteArray.readUnsignedByte()>>3;

_swfByteArray.position = Math.ceil((_swfSize*4)/8+5);// 计算 rect 结束位置
trace("当前ByteArr游标",_swfByteArray.position); 
_frameRate = _swfByteArray.readShort()/256;//读取帧频 因为低8位是小数,所以需要除以2的8次方

_frameTotal = _swfByteArray.readShort();//读取 总帧数

trace("compressed:",compressed,"swf_version:",_version,"frameRate:",_frameRate,"frameTotal:",_frameTotal);
parseTagType();
}

private function parseTagType():void
{     
//设置读取数据的字节顺序为倒序(以字节为单位)
_swfByteArray.endian = Endian.LITTLE_ENDIAN; 
while(_swfByteArray.bytesAvailable)
{
var tagHead:int = _swfByteArray.readShort();
var tagType:int = tagHead>>6;

//0x3F  00111111
var tagLength:int = tagHead & 0x3F;   
if(tagLength == 63) //如果tag 是长类型
{
tagLength = _swfByteArray.readUnsignedInt();
}
// 解析 symbolClass tag
if(tagType == 76) 
{   
parseSymbolClass(tagLength); 
}
else
{
_swfByteArray.position += tagLength;
}
}
}  
private function parseSymbolClass(length:int):void
{
_classList = [];
var classNum:int = _swfByteArray.readShort();
while(classNum --)
{   
var classId:int = _swfByteArray.readUnsignedShort();
// trace("classId之后的位置是"+_swfByteArray.position);
var char:int = _swfByteArray.readByte(); 
var name:String = "";
while(char)

{    
name += String.fromCharCode(char);    
char = _swfByteArray.readByte(); 
}
trace("导出类名为"+name);
_classList.push(name);

analysisCompleteFun(_classList);
}

protected function waitSwf(event:Event):void
{
}
}

}

startAnalysis方法中需要传入载入swf的二进制,然后和一个解析完毕的回调方法  回调方法中的参数是一个数组,里面存放了所有找到的链接名字

as3中得到swf文件中的链接名字相关推荐

  1. sharepoint页面嵌入_在SharePoint 2010页面中嵌入SWF文件

    在SharePoint 2007之前的版本中,我们可以像在普通的html页面里一样,在SharePoint页面中插入Flash文件.但是,当我在2010里做相同的工作时却发现始终是提示"没有 ...

  2. python db文件_python中查看.db文件中表格的名字及表格中的字段操作

    1.问题描述: 我桌面上有一个"账号密码.db"文件,我现在想知道里面有几张表格table.表格的名字.表头结构. 2.使用SQL语句"""selec ...

  3. html中引入txt文件,如何导入放置在txt文件中的.html文件中的代码?

    所以,我想要的是这个.我有一个HTML文件,我想从代码加载文本文件.因此,浏览器应该从该文本文件中获取代码并将其作为HTML代码的一部分进行阅读.这里有一个例子:如何导入放置在txt文件中的.html ...

  4. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  5. vscode中如何创新建php文件,php – 如何在Visual Studio Code,UNIX中的所有文件中创建所有行结尾(EOL)?...

    我使用Windows 10 home,我通常使用Visual Studio Code(VSCODE)来编辑Linux Bash脚本以及PHP和JavaScript. 我没有开发任何专门用于Window ...

  6. android怎么查看方法被谁调用,Android中查看布局文件中的控件(view,id)在哪里被调用(使用)...

    在阅读别人的代码时通常是很痛苦的,有时很想要看一看布局中的控件在哪里被调用了,为之很苦恼 在这里提供一种方法. 复制要查看的控件ID,到R文件中搜索到该ID, 接下来就好办的了,选中ID按下Ctrl鼠 ...

  7. Java中的properties文件中的key不能使用项目中的接口名和Java文件名

    Java中的properties文件中的key不能使用项目中的接口名和Java文件名,否则在反射生成实体类的时候会出现报错的情况.

  8. 如果在一个工程中有两个vhd文件,就相当于有两个模块,那么对于这个工程整体的bdf文件生成,怎么把这两个模块都加到同一个bdf文件中。bdf文件中两个模块之间的连线及输入输出,是自己输进去的还是自动生

    如果在一个工程中有两个vhd文件,就相当于有两个模块,那么对于这个工程整体的bdf文件生成,怎么把这两个模块都加到同一个bdf文件中.bdf文件中两个模块之间的连线及输入输出,是自己输进去的还是自动生 ...

  9. 【sql的mapper.xml文件】完美去除idea中mapper.xml文件中的黄色绿色背景色

    文章目录 完美去除idea中mapper.xml文件中的背景色 换主题颜色 1.settings->Editor->Inspection 2.Editor->Color Scheme ...

最新文章

  1. mysql存储过程结构体_八、mysql视图、存储过程、函数以及时间调度器
  2. ORACLE 查询约束
  3. 真相了 | 敲代码时,程序员戴耳机究竟在听什么?
  4. 重定向dup2的本质
  5. 如何安装 jupyter lab 和 jupyter notebook?
  6. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
  7. IdentityServer4(八)使用EntityFramework Core对数据进行持久化
  8. Zabbix探索:无法获取Windows主机CPU利用率、负载等问题处理
  9. 我的YUV播放器MFC小笔记:unicode编码、宽字符
  10. 女生做产品经理好吗_谁说女生不适合做产品经理?
  11. 【Eclipse】启动时报错:No Java virtual machine (已解决)
  12. 读《反欺骗的艺术》有感
  13. android nfc读写demo,android nfc常用标签读取总结
  14. 信噪比计算方式(小问题解惑)
  15. 地球上最长的两座山脉:一座4800公里,一座8900公里
  16. win10共享打印错误0x0000006_win7系统局域网无法共享惠普打印机提示0x000006be错误的解决方法...
  17. 大数据人工智能ai培训师专家讲师叶梓介绍及ChatGPT提纲
  18. 计算机二级c教程ppt,计算机国家二级C语言教程 第一二章.ppt
  19. mysql数据模型三要素_E-R模型的三要素为实体、属性、联系-智慧树数据库原理章节答案...
  20. java 网络编程详细解析

热门文章

  1. java 连接ntp服务器_NTP搭建-时间服务器
  2. C语言实现矩阵旋转输出
  3. stc89c51单片机音乐盒系统设计_基于51单片机音乐盒课程设计1.doc
  4. C语言网购打折商品V2.0
  5. 关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红
  6. 全志A40i开发板(4核ARM Cortex-A7)测评合集——开箱上电测试
  7. 王老吉高考季花式营销又来啦 商标续展可不能忘
  8. ue4多人联网的实例
  9. Crosswalk Project for Linux
  10. dropbear编译安装与使用