收藏
swf文件格式解析入门(tag解析)
2010-12-02 11:29
上文把文件头解析完成了,接下来就是解析标签
swf文件把所有的资源都打包在标签内部
如字体,位图,嵌入的2进制,代码等等
tag有两种类型,1种为短tag,1种为长tag
短tag的长度是小于63个字节的
短标签格式
RECORDHEADER (short)
Field Type Comment
TagCodeAndLength UI16 Upper 10 bits: tag type Lower 6 bits: tag length
高10位表示标签类型,低6位表示标签长度
长标签格式 长标签的TagCodeAndLength为0x3F (=63)
长标签使用Length来表示标签的长度
RECORDHEADER (long)
Field Type Comment
TagCodeAndLength UI16 Tag type and length of 0x3F Packed together as in short header
Length SI32 Length of tag
跟着标签头后面就是标签指定长度的数据
然后根据不同的标签类型来解析数据就可以了
每个tag读取结束后,后面的又重新字节对齐了,不用考虑剩余几个字节的问题
/**
* 读取tag类型,不移动position
* @param bytes
* @return
*/
private function readTagType(bytes:ByteArray):uint
{
var result:uint = bytes.readUnsignedShort();
result = result >> 6;
bytes.position -= 2;
return result;
}
/**
* 读取tag长度 不包括头本身占的长度
* @param bytes
* @return
*
*/
private function readTagLength(bytes:ByteArray):uint{
var tagLength:uint = (bytes.readUnsignedShort() & 0x3F);
if (tagLength == 0x3F){
tagLength = bytes.readUnsignedInt();
};
if (tagLength < 0){
throw (Error("SWFReader:无效的tag长度"));
};
return tagLength;
}
/**
* 读取tag列表
* @param bytes
*
*/
private function readTags(bytes:ByteArray):Array
{
var result:Array = [];
var tagType:uint;
var tagLength:uint;
var start:int;
var tag:Tag;
var cl:Class;
while(bytes.bytesAvailable > 0)
{
start = bytes.position;
tagType = readTagType(bytes);
tagLength = readTagLength(bytes);
cl = TagTypes.getTagClassByTagType(tagType);
if (cl == null)
{
trace("Tag Not Found, Type=" + tagType, tagLength);
bytes.position += tagLength;// 跳过长度
continue;
}
tag = new cl();
tag.tagType = tagType;
if( tagLength > 0)
bytes.readBytes(tag.data, 0, tagLength);
tag.data.endian = Endian.LITTLE_ENDIAN;
tag.data.position = 0;
// 调用解析方法
tag.parse();
result.push(tag);
if (tagType == TagTypes.TAG_END)
break;
}
return result;
}
// 所有的tag类型列表
package swf.file.tags
{
import com.the9.nbu.swf.file.tags.actions.*;
import com.the9.nbu.swf.file.tags.binary.*;
import com.the9.nbu.swf.file.tags.bitmaps.*;
import com.the9.nbu.swf.file.tags.buttons.*;
import com.the9.nbu.swf.file.tags.control.*;
import com.the9.nbu.swf.file.tags.displaylist.*;
import com.the9.nbu.swf.file.tags.font.*;
import com.the9.nbu.swf.file.tags.shapemorphing.*;
import com.the9.nbu.swf.file.tags.shapes.*;
import com.the9.nbu.swf.file.tags.sounds.*;
import com.the9.nbu.swf.file.tags.sprite.*;
import com.the9.nbu.swf.file.tags.text.*;
import com.the9.nbu.swf.file.tags.video.*;
import com.the9.nbu.swf.file.tags.unknown.*;
/**
* TagTypes
* @author 任冬 rendong237@126.com
* $Id: TagTypes.as 499 2010-11-19 10:02:56Z rendong $
* @version 1.0
*/
public class TagTypes
{
// Flash 1 tags
public static const TAG_END:uint = 0;
public static const TAG_SHOWFRAME:uint = 1;
public static const TAG_DEFINESHAPE:uint = 2;
public static const TAG_FREECHARACTER:uint = 3;
public static const TAG_PLACEOBJECT:uint = 4;
public static const TAG_REMOVEOBJECT:uint = 5;
public static const TAG_DEFINEBITS:uint = 6;
public static const TAG_DEFINEBUTTON:uint = 7;
public static const TAG_JPEGTABLES:uint = 8;
public static const TAG_SETBACKGROUNDCOLOR:uint = 9;
public static const TAG_DEFINEFONT:uint = 10;
public static const TAG_DEFINETEXT:uint = 11;
public static const TAG_DOACTION:uint = 12;
public static const TAG_DEFINEFONTINFO:uint = 13;
public static const TAG_DEFINESOUND:uint = 14;
public static const TAG_STARTSOUND:uint = 15;
public static const TAG_STOPSOUND:uint = 16;
public static const TAG_DEFINEBUTTONSOUND:uint = 17;
public static const TAG_SOUNDSTREAMHEAD:uint = 18;
public static const TAG_SOUNDSTREAMBLOCK:uint = 19;
// Flash 2 tags
public static const TAG_DEFINEBITSLOSSLESS:uint = 20;
public static const TAG_DEFINEBITSJPEG2:uint = 21;
public static const TAG_DEFINESHAPE2:uint = 22;
public static const TAG_DEFINEBUTTONCXFORM:uint = 23;
public static const TAG_PROTECT:uint = 24;
public static const TAG_PATHSAREPOSTSCRIPT:uint = 25;
// Flash 3 tags
public static const TAG_PLACEOBJECT2:uint = 26;
public static const TAG_REMOVEOBJECT2:uint = 28;
public static const TAG_SYNCFRAME:uint = 29;
public static const TAG_FREEALL:uint = 31;
public static const TAG_DEFINESHAPE3:uint = 32;
public static const TAG_DEFINETEXT2:uint = 33;
public static const TAG_DEFINEBUTTON2:uint = 34;
public static const TAG_DEFINEBITSJPEG3:uint = 35;
public static const TAG_DEFINEBITSLOSSLESS2:uint = 36;
// Flash 4 tags
public static const TAG_DEFINEEDITTEXT:uint = 37;
public static const TAG_DEFINEVIDEO:uint = 38;
public static const TAG_DEFINESPRITE:uint = 39;
public static const TAG_NAMECHARACTER:uint = 40;
public static const TAG_PRODUCTINFO:uint = 41;
public static const TAG_DEFINETEXTFORMAT:uint = 42;
public static const TAG_FRAMELABEL:uint = 43;
// Flash 5 tags
public static const TAG_DEFINEBEHAVIOR:uint = 44;
public static const TAG_SOUNDSTREAMHEAD2:uint = 45;
public static const TAG_DEFINEMORPHSHAPE:uint = 46;
public static const TAG_FRAMETAG:uint = 47;
public static const TAG_DEFINEFONT2:uint = 48;
public static const TAG_GENCOMMAND:uint = 49;
public static const TAG_DEFINECOMMANDOBJ:uint = 50;
public static const TAG_CHARACTERSET:uint = 51;
public static const TAG_FONTREF:uint = 52;
public static const TAG_DEFINEFUNCTION:uint = 53;
public static const TAG_PLACEFUNCTION:uint = 54;
public static const TAG_GENTAGOBJECT:uint = 55;
public static const TAG_EXPORTASSETS:uint = 56;
public static const TAG_IMPORTASSETS:uint = 57;
public static const TAG_ENABLEDEBUGGER:uint = 58;
// Flash 6 tags
public static const TAG_DOINITACTION:uint = 59;
public static const TAG_DEFINEVIDEOSTREAM:uint = 60;
public static const TAG_VIDEOFRAME:uint = 61;
public static const TAG_DEFINEFONTINFO2:uint = 62;
public static const TAG_DEBUGID:uint = 63;
public static const TAG_ENABLEDEBUGGER2:uint = 64;
public static const TAG_SCRIPTLIMITS:uint = 65;
// Flash 7 tags
public static const TAG_SETTABINDEX:uint = 66;
// Flash 8 tags
public static const TAG_FILEATTRIBUTES:uint = 69;
public static const TAG_PLACEOBJECT3:uint = 70;
public static const TAG_IMPORTASSETS2:uint = 71;
public static const TAG_DOABC:uint = 72;
public static const TAG_DEFINEFONTALIGNZONES:uint = 73;
public static const TAG_CSMTEXTSETTINGS:uint = 74;
public static const TAG_DEFINEFONT3:uint = 75;
public static const TAG_SYMBOLCLASS:uint = 76;
public static const TAG_METADATA:uint = 77;
public static const TAG_SCALINGGRID:uint = 78;
public static const TAG_DOABC2:uint = 82;
public static const TAG_DEFINESHAPE4:uint = 83;
public static const TAG_DEFINEMORPHSHAPE2:uint = 84;
// Flash 9 tags
public static const TAG_DEFINESCENEANDFRAMELABELDATA:uint = 86;
public static const TAG_DEFINEBINARYDATA:uint = 87;
public static const TAG_DEFINEFONTNAME:uint = 88;
public static const TAG_STARTSOUND2:uint = 89;
public static const TAG_DEFINEBITSJPEG4:uint = 90;
// Flash 10 tags
public static const TAG_DEFINEFONT4:uint = 91;
/**
* tagType => tag 名称
*/
private static const TAG_NAMES:Array =["End","ShowFrame","DefineShape","FreeCharacter","PlaceObject","RemoveObject","DefineBits","DefineButton","JPEGTables","SetBackgroundColor","DefineFont","DefineText","DoAction","DefineFontInfo","DefineSound","StartSound","StopSound","DefineButtonSound","SoundStreamHead","SoundStreamBlock","DefineBitsLossless","DefineBitsJPEG2","DefineShape2","DefineButtonCxform","Protect","PathsArePostScript","PlaceObject2","27 (invalid)","RemoveObject2","SyncFrame","30 (invalid)","FreeAll","DefineShape3","DefineText2","DefineButton2","DefineBitsJPEG3","DefineBitsLossless2","DefineEditText","DefineVideo","DefineSprite","NameCharacter","ProductInfo","DefineTextFormat","FrameLabel","DefineBehavior","SoundStreamHead2","DefineMorphShape","FrameTag","DefineFont2","GenCommand","DefineCommandObj","CharacterSet","FontRef","DefineFunction","PlaceFunction","GenTagObject","ExportAssets","ImportAssets","EnableDebugger","DoInitAction","DefineVideoStream","VideoFrame","DefineFontInfo2","DebugID","EnableDebugger2","ScriptLimits","SetTabIndex","67 (invalid)","68 (invalid)","FileAttributes","PlaceObject3","ImportAssets2","DoABC","DefineFontAlignZones","CSMTextSettings","DefineFont3","SymbolClass","Metadata","ScalingGrid","79 (invalid)","80 (invalid)","81 (invalid)","DoABC2","DefineShape4","DefineMorphShape2","85 (invalid)","DefineSceneAndFrameLabelData","DefineBinaryData","DefineFontName","StartSound2","DefineBitsJPEG4","DefineFont4"];
/**
* tagType => tag class
*/
private static const TAG_CLASS:Array = [EndTag,ShowFrameTag,DefineShapeTag,FreeCharacterTag,PlaceObjectTag,RemoveObjectTag,DefineBitsTag,DefineButtonTag,JPEGTablesTag,SetBackgroundColorTag,DefineFontTag,DefineTextTag,DoActionTag,DefineFontInfoTag,DefineSoundTag,StartSoundTag,StopSoundTag,DefineButtonSoundTag,SoundStreamHeadTag,SoundStreamBlockTag,DefineBitsLosslessTag,DefineBitsJPEG2Tag,DefineShape2Tag,DefineButtonCxformTag,ProtectTag,PathsArePostScriptTag,PlaceObject2Tag,null,RemoveObject2Tag,SyncFrameTag,null,FreeAllTag,DefineShape3Tag,DefineText2Tag,DefineButton2Tag,DefineBitsJPEG3Tag,DefineBitsLossless2Tag,DefineEditTextTag,DefineVideoTag,DefineSpriteTag,NameCharacterTag,ProductInfoTag,DefineTextFormatTag,FrameLabelTag,DefineBehaviorTag,SoundStreamHead2Tag,DefineMorphShapeTag,FrameTagTag,DefineFont2Tag,GenCommandTag,DefineCommandObjTag,CharacterSetTag,FontRefTag,DefineFunctionTag,PlaceFunctionTag,GenTagObjectTag,ExportAssetsTag,ImportAssetsTag,EnableDebuggerTag,DoInitActionTag,DefineVideoStreamTag,VideoFrameTag,DefineFontInfo2Tag,DebugIDTag,EnableDebugger2Tag,ScriptLimitsTag,SetTabIndexTag,null,null,FileAttributesTag,PlaceObject3Tag,ImportAssets2Tag,DoABCTag,DefineFontAlignZonesTag,CSMTextSettingsTag,DefineFont3Tag,SymbolClassTag,MetadataTag,ScalingGridTag,null,null,null,DoABCTag,DefineShape4Tag,DefineMorphShape2Tag,null,DefineSceneAndFrameLabelDataTag,DefineBinaryDataTag,DefineFontNameTag,StartSound2Tag,DefineBitsJPEG4Tag,DefineFont4Tag];
/**
* 根据编号获取tag名称
* @param tagType
* @return
*
*/
public static function getTagNameByTagType(tagType:int):String
{
return TAG_NAMES[tagType] || null;
}
/**
* 根据变化获取tag class
* @param tagType
* @return
*
*/
public static function getTagClassByTagType(tagType:int):Class
{
return TAG_CLASS[tagType] || null;
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/singandsong/archive/2011/01/05/6118243.aspx
分享到:
相关推荐
解析swf文件 源码
FPC.exe swf 格式 播放器 swf 文件 播放器
自己做的一个介绍SWF文件结构的PPT,仅供交流使用。
swf文件,文件头解析,得到文件的宽高,版本,签名,头部信息等,
Imperator FLA是一套可以从 SWF 文件格式转成 FLA 文件格式的软件,如此你可以由 Flash MX 软件中加以修改原来的 SWF 文件的内容。你只要作选择所要开启的 SWF 文件,再另存成 FLA 文件即可,再使用Flash MX 软件...
ajax简单入门讲解的swf文件ajax简单入门讲解的swf文件ajax简单入门讲解的swf文件
swf文件结构格式说明,详细说明,可以用vc进行解析
此软件可以将SWF格式文件转换为MPG格式,方便我们格式转换用
SWF文件的格式说明,用于分析SWF文件格式,以程序方式生成SWF使用。
swf文件最新v10版本文件格式介绍. Flash Player 10 introduces the following features and capabilities: Expands the SWF format’s text capability with the capability to render bidirectional text (right-to...
swf文件格式说明书(中文+英文)
exe转swf文件格式转换v1.0绿色免费版
有效的去除flash swf文件加密,使flash文件中的各种资源 可以提取编辑 有效的去除flash swf文件加密,使flash文件中的各种资源 可以提取编辑
SWF 解析工具 flash解析 解析出flash源文件
可以将swf格式动画转换成视频文件 文件名称:swf文件格式软件器 文件大小:3.13M
swf文件制作swf文件制作swf文件制作swf文件制作
抽空再花时间,整理下具体的代码含义。 这提取的较完整的swf反编译的fla.. 纯参考研究用...希望对下载的童鞋有帮助..
SWF文件格式V9规范,中英文版,PDF清晰版。
SWF文件修改工具SWF文件修改工具SWF文件修改工具SWF文件修改工具
简单易用的SWF文件格式查看和编辑工具修改swf工具┊汉化绿色免费版