swf文件结构解析
原文:http://blog.csdn.net/flybirdice/article/details/414588 最近要研究swf文件格式,先保存这篇再说。 第1节 swf文件的整体结构是 header + body的组成。 文件的开始是一个[文件头] 字节????? 名称??????????? 说明 以上是swf中,最简单的一个tag,一个完整的swf文件是由很多独立的tag组成的。每一个tag都包括一个头和一个数据体,头有2种类型,短tag型和长tag型。 短tag型由2byte构成,前10个bit表示tag类型,后6个bit表示tag长度。 长tag型由6byte构成,前10个bit表示tag类型,后6个bit固定为全1,后4个byte代表tag长度。 tag的长度不同于文件头的长度FileLength,它是除去tag头后的长度。 (另外)只有非加密的swf文件可以直接用以上的方法解析,加密的文件需要另外增加一步处理。具体方法由于牵涉到版权问题,这里我不加说明。 前节说明了swf文件是由1个head和1个body构成的。 下面余下的就是swf文件的body了。 整个文件body是由大量的tag组成的,通过分析tag的head部分,可以立刻知道这个tag的类型代码和长度。 如果你无法识别这个tag的类型,也可以利用tag的长度,直接跳过这个tag。 这种方式保证了版本的兼容性,即使出现了新的tag,老版本的播放器还是能够解析完整个swf文件而不出现错误,大不了就是不能提供新的功能而已。 以下就是swf文件结构的一个形象概念。 (文件header)(文件body)
下一节我会分析一下几个swf必有的tag,包括 backgroundColor tag,showFrame tag和end tag 第3节 这个tag是直接跟在文件head后面的第一个tag,是文件中必然存在的。 长度(bit)?????????? 名称??????????????????????? 说明
showFrame tag 这是文件最后第2个tag,它是必然存在的。
end tag 结束tag,它的作用不用我说了,必然是文件的最后一个tag。
下一节我将讲的是character ID 和Depth的意义和textField的基本tag组成。 第4节 这里讨论动态文本框的组成。 DefineFont2 定义了一个字体信息, DefineEditText引用了定义的字体,并定义了显示的文字信息,而PlaceObject引用了定义的文字信息,并控制了文字的显示。 他们之间的引用就是依靠character ID进行的。 character ID就是一个从1开始的数字标示,如果中间出现缺漏,从缺漏开始的所有character ID都被忽略,而重复的话,后出现的将覆盖先出现的tag。 DefineFont2用一个character ID 来标示自己,DefineEditText和PlaceObject2也同样如此。但并不是所有的tag都有character ID。 而深度Depth在3个tag中只有PlaceObject2拥有。 这3个tag的关系就是这样。这3个tag的结构我会在下节中说明。(抱歉,每次都说一点点!) 第5节 DefineFont2 关于文字的几乎所有信息,都可以在这个tag中进行设置,因此,这也是一个相当复杂的tag。 长度(bit)?????????????????????? 名称??????????????????????? 说明 headerLength?????????????? header???????????????? tag头,类型码为48 16?????????????????????? FontID?????????????????? character ID,唯一的标示 1???????????????????????? FontFlagsHasLayout? 根据字面解释,判断是否有变型的标记 1???????????????????????? FontFlagsShiftJIS????? 是否使用ShiftJIS编码 1???????????????????????? FontFlagsSmallText?? 是否使用小字体显示 1???????????????????????? FontFlagsANSI????????? 是否使用ANSI编码 1???????????????????????? FontFlagsWideOffsets 是否使用32位偏移量 1???????????????????????? FontFlagsWideCodes? 是否使用16位文字编码 1???????????????????????? FontFlagsItalic?????????? 文字是否是斜体 1???????????????????????? FontFlagsBold??????????? 文字是否是粗体 8???????????????????????? LanguageCode????????? 语言编码,有相应的编码表对应 8???????????????????????? FontNameLen?????????? 文件名长度 FontNameLen*8?????????? FontName????????????? 文件名称(使用utf8编码)? 16????????????????????????????? NumGlyphs???????????? 轮廓字个数 32/16???????????????????????? OffsetTable???????????? 根据FontFlagsWideOffsets,为32位,否则为16位 32/16???????????????????????? CodeTableOffset???? 同上 不定*NumGlyphs????????? GlyphShapeTable???? 轮廓字信息,为shape结构(又是一个复杂结构) 16/8?????????????????? CodeTable????????????? 根据FontFlagsWideCodes,为16位。编码表,为固定值UCS-2 16/0?????????????????? FontAscent??????????? 根据FontFlagsHasLayout,为16位,否则没有该字段 16/0????????????????? FontDescent?????????? 根据FontFlagsHasLayout,为16位,否则没有该字段 16/0????????????????? FontLeading?????????? 根据FontFlagsHasLayout,为16位,否则没有该字段 16/0*NumGlyphs??????? FontAdvanceTable? 根据FontFlagsHasLayout,为16位,否则没有该字段 RECT*NumGlyphs?????? FontBoundsTable??? 根据FontFlagsHasLayout,为16位,否则没有该字段 16/0???????????????????????? KerningCount??????? 根据FontFlagsHasLayout,为16位,否则没有该字段 KERNINGRECORD*KerningCount FontKerningTable??? 根据FontFlagsHasLayout,为16位,否则没有该字段 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |