swf文件解析(一) 文件header部分解析

来源:互联网 发布:mmd腰震骑射动作数据 编辑:程序博客网 时间:2024/05/22 00:38
SWF(shock wave flash)是ADOBE公司的动画设计软件Flash的专用格式。

这种格式具有许多优点,诸如可扩展性高,网络传输需求低,对外部依赖(如字体)依赖小,硬件需求小等。

SWF文件头包含该文件的压缩情况、版本号、文件内容长度及相关播放信息,如下表:


Signature:
文件前3个Byte为固定的”CWS”或者”FWS”,其中”FWS”为未经过压缩的SWF文件,”CWS”为使用标准Zlib压缩过的SWF文件。
自Flash11开始,新增加了SWF对LZMA压缩的支持,出现了以”ZWS”开头的SWF文件。

Version
signature之后的1Byte为SWF的version,如上图所示,version为0x0e。

FileLength:
filelength为文件解压后真实长度,类型为UI32(unsigned int),上图中79 04 00 00应为0x479,即1145byte

对CWS的解压,可以调用zilb.h中的uncompress完成
<span style="font-size:14px;">uncompress( bufd, &destlen, buf, complen-8 );</span>
bufd: 解压后数据存储地址,需要预先申请存储空间。上图中需要申请0x479-0x8 byte的内存空间(79 04 00 00)
destlen: 为实际解压后大小,如果文件未被破坏或出现错误,执行完uncompress函数后destlen的大小应该同bufd大小相同(0x479-0x8)
buf: CWS文件除去(Singnature+Version+filelength)部分数据。
complen-8: complen为CWS文件实际大小,8为(Singnature+Version+filelength)大小,如上所述。
解压后添加上文件头,就可以完成CWS解压至FWS,如下图:

FrameSize:
The FrameSize field defines the width and height of the on-screen display.
FrameSize为结构体类型,保存frame大小的矩形信息

对FrameSize的解析共分为两个步骤
1. 获取5bit(Nbits)
0x78转换为二进制位0111 1000
取前5个bit位01111,即15个bit,意味着Xmin、Xmax、Ymin、Ymax各占15个bit
2. 根据Nbits读取矩形信息
15*4 = 60,即还需要60bit,除去0x78后3bit,还需要57bit,57bit需要8byte提供,如下图:
上述数据对应的二进制如下,橙色为Nbits,红色为Xmin,绿色为Xman,蓝色为Ymin,紫色为Ymax,灰色部分舍弃。
0111 1000 0000 0000 00000111 1101 0000 0000 0000 0000 0000 0001 0111 0111 0000 0000 0000
因此Xmin = 0;Xmax = 16000;Ymin = 0;Ymax = 16000

FrameRate:
The FrameRate is the desired playback rate in frames per second.
如上图所示,FrameRate = 0x1e00。

FrameCount:
The FrameCount is the total number of frames in this SWF file.

如上图所示,FrameCount = 0x01。

至此,SWF文件的文件头就解析完毕了。



0 0
原创粉丝点击