当前位置:首页  »  Flash课件  »  FLASH SWF 文件结构解析-佚名-

  • FLASH SWF 文件结构解析-佚名-

  • 第1节

    swf文件的整体结构是 header + body的组成。

    文件的开始是一个[文件头]
    它的结构如下:

    字节      名称            说明
    1          Signature     “F”表示非加密格式,“C”表示加密格式
    1          Signature     “W”无特殊意义
    1          Signature     “S”无特殊意义
    1          Version        版本号,它表示对应播放器版本
    4          FileLength    整个文件长度,低位在前
    N          FrameSize    RECT结构体,表示屏幕大小,具体结构和长度根据数据变化,分析方法另外讨论。
    2          FrameRate    帧频,默认为12,高位在前
    2          FrameCount  帧数,表明文件根下的帧数,低位在前

    以上是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文件可以直接用以上的方法解析,加密的文件需要另外增加一步处理。具体方法由于牵涉到版权问题,这里我不加说明。


    这份资料可能对flash设计意义不大,但如果有人用的着,我会继续分析一下,如果有人也在做这方面的调查,欢迎和我一起讨论。


    第2节

    前节说明了swf文件是由1个head和1个body构成的。
    并且解析了header的结构,和一个tag的header部分的简单说明。

    下面余下的就是swf文件的body了。

    整个文件body是由大量的tag组成的,通过分析tag的head部分,可以立刻知道这个tag的类型代码和长度。

    如果你无法识别这个tag的类型,也可以利用tag的长度,直接跳过这个tag。

    这种方式保证了版本的兼容性,即使出现了新的tag,老版本的播放器还是能够解析完整个swf文件而不出现错误,大不了就是不能提供新的功能而已。

    以下就是swf文件结构的一个形象概念。

    (文件header)(文件body)
                  |
    (tag 1)(tag 2)(tag 3)(……)
       |
    (tag header)(tag body)
       |
    (tag 类型代码)(tag 长度)

     

    这样大家是否对swf文件的结构有了一个基本的认识?

    下一节我会分析一下几个swf必有的tag,包括 backgroundColor tag,showFrame tag和end tag

    第3节
    setBackgroundColor tag

    这个tag是直接跟在文件head后面的第一个tag,是文件中必然存在的。
    它的结构如下:

    长度(bit)           名称                        说明
    16                 header                    tag头,短tag型 类型码为9
    24                 BackgroundColor       RGB类型,右3个字节,分别表示红、绿、蓝


    showFrame tag

    这是文件最后第2个tag,它是必然存在的。
    结构如下:


    长度(bit)           名称                        说明
    16                  header                    tag头,短tag型 类型码为1


    end tag

    结束tag,它的作用不用我说了,必然是文件的最后一个tag。


    长度(bit)           名称                        说明
    16                  header                    tag头,短tag型 类型码为0


    下一节我将讲的是character ID 和Depth的意义和textField的基本tag组成。
    (另外)感谢AOL的补充和解释。

    第4节
    一个textField就是一个文本框,文本框有3种,静态的,动态的,和输入型。作为tag的话,它只有2种,静态的和动态的,输入型不过是动态的一种特别形式。

    这里讨论动态文本框的组成。
    它由3个tag组成,2个定义tag和一个控制tag
    分别是:
    定义tag DefineFont2 DefineEditText (针对player 7.0 如有不同情况请检查播放器版本)
    控制tag PlaceObject2

    DefineFont2 定义了一个字体信息, DefineEditText引用了定义的字体,并定义了显示的文字信息,而PlaceObject引用了定义的文字信息,并控制了文字的显示。

    他们之间的引用就是依靠character ID进行的。

    character ID就是一个从1开始的数字标示,如果中间出现缺漏,从缺漏开始的所有character ID都被忽略,而重复的话,后出现的将覆盖先出现的tag。

    DefineFont2用一个character ID 来标示自己,DefineEditText和PlaceObject2也同样如此。但并不是所有的tag都有character ID。
    另外,PlaceObject2虽然也有character ID,但它并不是用来标示自己的,而是用来调用的。

    而深度Depth在3个tag中只有PlaceObject2拥有。

    这3个tag的关系就是这样。这3个tag的结构我会在下节中说明。(抱歉,每次都说一点点!)

    第5节

    DefineFont2
    这个tag的作用是定义一个字体,或者一组静态轮廓字,用以给DefineEditText使用。

    关于文字的几乎所有信息,都可以在这个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位,否则没有该字段

    全国精品课程资源库
  • 友情链接
  • 更多>>最近更新Flash课件

    更多>>Flash课件本月排行

    免责声明:本站所有课件和视频均来自互联网收集而来,版权归原大学所有,如果侵犯了你的权益,请通知我们,我们会及时删除侵权内容,谢谢合作!
    湘ICP备09003080号 课件开发,网站设计等 qq:3710167 Copyright @2003-2010 网络万亿国际娱乐吧, 版权所有  本站技术支持原创论文 | 网学网  
    博聚网