加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

as3中得到swf文件中的链接名字

发布时间:2020-12-15 18:00:14 所属栏目:百科 来源:网络整理
导读:以前自己写编辑器的时候需要读取一个flash生成的swf文件 然后得到swf中的链接名字 就是这个样子,然后我从网上找了好多例子都没有很好的,最后用swf的文件结构实现了读取swf中链接的工具 今天有一个朋友也遇到了这个需求,处于方便写篇帖子,以后有需要的朋

以前自己写编辑器的时候需要读取一个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 ?00222221
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的二进制,然后和一个解析完毕的回调方法 ?回调方法中的参数是一个数组,里面存放了所有找到的链接名字

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读