as3中得到swf文件中的链接名字
生活随笔
收集整理的這篇文章主要介紹了
as3中得到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 ?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文件中的链接名字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu16.04耳机没有声音解决办
- 下一篇: 人人都在推销(销售永不为“奴”)