收藏
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(ShockWave Flash)文件是一种广泛用于网络的多媒体格式,主要用来展示动画、交互式内容和游戏。本文将深入探讨SWF文件的解析过程,包括文件头解析,以获取文件的宽度、高度、版本信息以及其他关键头部数据。 ...
使用Visual C++(简称VC)进行SWF文件解析需要对SWF文件格式有深入理解。解析过程通常涉及以下几个步骤: 1. **读取文件头**:首先读取文件的前几个字节,获取文件版本和整体长度信息,这有助于后续的字节流解析。 ...
### SWF 文件格式 V10 版本介绍与解析 #### 概述 SWF(Small Web Format 或 Shockwave Flash)文件格式是 Adobe Systems 为网络动画和多媒体内容设计的一种文件格式。它允许用户创建包括矢量图形、位图图像、音频...
SWF文件格式是Adobe公司开发的一种用于网络动画和应用程序的文件格式,全名为Small Web Format,也被称为Shockwave Flash。SWF文件格式广泛应用于网页动画、小游戏、广告和各种交互式内容的展示。SWF文件格式说明...
SWF是一种用于在网络上传输多媒体内容的文件格式,常用于在线展示动画、交互式应用程序和游戏。 百度文库是一个在线文档分享平台,用户可以上传、查看和下载各种文档,包括PDF、Word、PPT等格式,其中也包含SWF格式...
总之,解析SWF文件涉及对二进制格式的理解、各种数据块的解码以及ActionScript的解析。这个过程需要对计算机图形学、压缩算法和编程有深入的掌握。通过"MiddleCompTest1"这样的源码学习,可以加深对SWF文件内部工作...
SWF(Small Web Format)是一种由Adobe公司开发的用于在Web上展示动画和交互内容的文件格式。它广泛应用于早期的网页设计、在线游戏以及多媒体应用程序。本篇将详细介绍SWF解析工具及其在处理Flash源文件中的应用。 ...
### SWF 文件格式详解 #### 一、概述 SWF(Shockwave Flash)是一种由Adobe Systems开发并维护的多媒体文件格式,主要用于存储矢量动画、位图图像以及交互式内容等。这种格式广泛应用于网络上的动画播放、游戏开发...
自己做的一个介绍SWF文件结构的PPT,仅供交流使用。
在本文中,我们将深入探讨...总结,构建一个VC++的Flash播放器涉及SWF文件格式解析、C++编程、Windows API接口使用以及项目编译等多个方面。通过逐步理解并实现每个部分,我们可以构建出一个功能完备的Flash播放器。
SWF文件是Adobe Flash开发的动画和交互式内容格式,常用于网页上的小游戏、广告和其他多媒体元素。然而,为了保护内容不被非法复制或编辑,许多SWF文件会被添加保护措施,包括加密。本篇文章将深入探讨如何有效地...
Imperator FLA是一款专业的SWF到FLA转换工具,它为用户提供了一种便捷的方法来将已有的SWF文件还原为可编辑的FLA格式。在Flash动画制作领域,FLA文件是Adobe Flash(以前称为Flash MX)的工作源文件,包含了所有的...
总结来说,这个项目涉及到了PDF文件的处理、SWF文件的生成与解析,以及使用Java编程语言实现这两个文件格式之间的转换。对于熟悉Java和多媒体处理的开发者而言,这是一个宝贵的资源,可以帮助他们理解和构建类似的...
### Adobe SWF 文件格式规范 **一、基本数据类型** #### 1.1 坐标与 Twips 在SWF文件格式中,坐标系统基于Twips单位进行测量。一个Twip等于1/20个点(即1/1440英寸),这有助于在不同分辨率的显示设备上保持图形...
本文档主要讲解如何将网页中的swf flash文件提取保存,并用虚拟打印机将其转换成PDF格式文件。下面是详细的步骤和知识点: Step 1:提取SWF文件 在IE浏览器中,通过点击“工具”下的“Internet选项”打开...
SWF文件格式是一种广泛用于互联网上展示矢量图形、文本、视频和音频的高效传输格式,主要由Adobe Flash Player支持。SWF文件的设计目标包括适应屏幕显示、易于扩展、便于网络传输、简单实现、文件独立以及具备可伸缩...
此软件可以将SWF格式文件转换为MPG格式,方便我们格式转换用
SWF(ShockWave Flash)文件格式是Adobe Systems开发的一种用于在网络上传输多媒体内容的格式,广泛应用于网页动画、游戏和交互式应用程序。V9规范详细定义了这种文件格式的第九个版本,它涵盖了数据结构、编码方法...
Flash(SWF 文件)是一种广泛应用于互联网上的动画和交互式媒体格式,由Adobe Systems开发。SWF文件通常用于展示网页上的动态内容,如广告、游戏和多媒体应用。本压缩包"Flash(SWF文件)拆解.rar"提供了一个工具或...
SWF(ShockWave Flash)文件格式是Adobe公司开发的一种用于在网络上传输多媒体内容的格式,常见于网页上的动画、游戏和交互式应用。这个“简单易用的SWF文件格式查看和编辑工具”是一个专为SWF文件设计的实用程序,...