SWF文件头结构如下:
字段 类型 说明
标识 8位 表示文件是否被压缩("46" F 为没有压缩,"43" C 为被压缩)。
标识 8位 总是 "57" W。
标识 8位 总是 "53" S。
版本号 8位 代表SWF文件的版本(如果是9,就为 "09")。
文件长度 32位 表示文件的大小。
帧大小 RECT结构 表示舞台的大小。
帧频 16位 每秒要播放的帧数。
帧数 16位 总共的帧数。
以一个实际的未压缩SWF文件头为例子来分别说明上述字段:
46 57 53 05 B4 66 07 00 70 00 0F A0 00 00 BB 80 00 0C 9F 03
(1)字节1-3:46 57 53 <"FWS">
文件头以三个标识符开始,只能是0x46, 0x57, 0x53 (“FWS”)或者0x46, 0x57, 0x43 (“CWS”)。一个FWS标识表示该文件是未压缩文件.CWS标识表示从文件的第九个字节开始的所有内容,都是经过开放标准ZLIB压缩过的。CWS格式仅在SWF6以后才允许使用。
(2)字节4:05
在标识符之后的一个字节是版本号。这个版本号不是一个ASCII字符,而是一个8比特位的数字。例如,SWF5文件的版本号是0x05,不是ASCII字符"5"(0x36)。
(3)字节5-8:B4 66 07 00
一个Integer表示文件的长度。低在前,高在后,这里长度表示为0x000766B4 = 485044字节。文件长度字段代表包括文件头整个文件的总长度。如果是一个未压缩的SWF文件(FWS标识符),文件长度字段表示文件的精确大小;如果是一个经过压缩的SWF文件(CWS标识),文件长度字段表示解压后文件的大小,这样一般就不是实际文件的大小了。让未压缩(解压后)的大小可见,可以使解压过程更加高效。
(4)字节9-X:
这一段长度非固定,这是一个RECT结构。它表示的大小可以根据坐标(四个点的坐标)数值的变化而变化。文件大小RECT通常是这样的形式:Xmin和Ymin成员都为0;Xmax和Ymax成员声明宽度和高度。RECT的解析涉及到如下结构:
Bit Values 格式
Type Comment
SB[nBits] 有符号位值 (nBits表示用多少位来存储这个值)
UB[nBits] 无符号位值 (nBits表示用多少位来存储这个值)
RECT 格式
Field Type Comment
Nbits UB[5] Bits used for each subsequentfield
Xmin SB[Nbits] x minimum position for rectangle in twips
Xmax SB[Nbits] x maximum position for rectangle in twips
Ymin SB[Nbits] y minimum position for rectangle in twips
Ymax SB[Nbits] y maximum position forrectangle in twips
也就是说要解析出SWF文件的显示区域,步骤是这样的:得到第9个字节的前5位,这里就是0x70-->0x0E,即14。那么之后的字节就按照14比特位进行分割,共需要4(坐标点数) * 14(所占比特位) + 5(位指示) = 61 bits <> 8 Bytes。于是乎,从第9个字节到第16个字节就是RECT结构体所占用的字段:70 00 0F A0 00 00 BB 80 。解析如下:
01110000-00000000-00001111-10100000-00000000-0000000-010111011-10000000
01110-00000000000000-01111101000000-00000000000000-01011101110000-000
14-0-8000-0-6000
因为Flash的坐标是TWIP格式的,单位为1twip(1/20像素),所以得到的数据需要除以20的,即实际RECT值为(0,400,0,300)。
(5)字节17-18:00 0C
这两个字节表示帧速率。前一字节表示小数位,后一字节表示整数位,不过一般极少有小数位的帧率,所以一般我们只计整数就可以了,这里是0x0C,即每秒12帧。注意,这是一个理想的每秒播放帧数值,如果SWF文件包含声音流数据,或者Flash播放器运行在一个慢的CPU上,这个速率是不能保证的。
(6)字节19-20:9F 03
这两个字节表示Flash文件总的帧数,这里为0x039F = 927 帧。
SWF文件内容结构如下:
在文件头后面的是一些标签化的数据块。所有的标签都是用一种通用格式。所以任何程序在解析一个SWF文件时,都可以跳过那些还不明确的块。在每个块中的数据可以指向这个块中的偏移量,但绝不能指向另外一个块的偏移量。这样,在用工具处理SWF文件的时候就任意可以删除、插入和修改(而SWF文件不会被破坏)。
每个标签都是由一个类型和一个长度值开始的,存在两种标签头部格式:短格式和长格式。短标签头部用于62字节或者更小的标签数据,长标签头部能够用于任何大小不超过4GB的标签数据,从长远来看这将会是非常实用的。
1、记录头部(短)
字段 类型 说明
标签编码和长度 U16 高10位:标签类型;低6位:标签长度
注意:标签编码和长度字段并不是一个10位的位字段后面跟着6位的位字段,而是一个双字节的字,SWF文件不间断的字节排序使得这两者具有不同的布局。该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。如果标签的长度大于或者等于63字节,那么它会被存储在长标签头部。
2、记录头部(长)
字段 类型 说明
标签编码和长度 U16 以短标签头部方式存储的长度为63字节的标签编码和长度
长度 U32 标签的长度
注意:长标签头部由一个标识长度为63字节(0x3f)的短标签头部和一个32位的长度组成。
标签按作用可划分为两种类型: