swf文件格式1(中文翻译版)

来源:互联网 发布:mac os 10.12 qq截图 编辑:程序博客网 时间:2024/06/05 08:11

本文翻译自Adobe官方公布的SWF File Format Specification Version 10
这里附上英文版下载地址:
http://bbs.9ria.com/forum.php?mod=viewthread&tid=17207&highlight=swf%2Bfile*

本文纯属个人之作,如果文中发现错误请留言提出。

第一章基本讲得都是数据定义,后面讲解时,我们用到再解释说明,因此我们直接从第二章SWF结构概要开始翻译。

第二章 SWF结构概述

这一章节主要对构成SWF的基础元素进行讲解。

SWF文件头

所有的SWF文件都包括这样一个文件头,我们贴一个图,来说明这个头的结构
文件头

文件头以一个3字节字符串0x46、0x57、0x53("FWS")或者0x43,0x57,0x53("CWS")的标签开始。标签FWS标明这是一个未压缩SWF,标签CWS标明这是一个在头文件8字节之后使用zlib标准压缩的SWF,ZLIB库所使用的数据格式遵循RFCs文档1950-1952。压缩过的SWF只有在6版本或之后的版本才支持。在标签之后跟随的一个字节的数字表示版本号,这个数字不是一个ASCII 字符,是一个8位二进制数。例如SWF 4,这个版本字节是0x04, 而不是这个ASCII字符串“4”(0x34)。文件长度字段(FileLength)指的是这个SWF文件的字节总长度,包括文件头计算在内。如果一个SWF是未压缩的文件("FWS标签"),那么这个文件长度就刚好等于整个文件的大小。如果这是一个压缩过的SWF(“CWS”标签),文件长度就是解压后的总长度,因此和文件的大小并不相等。在知道解压缩后文件大小的情况下,解压过程会更高效。帧尺寸(FrameSize) 定义了屏幕展示区域的宽和高。这个字段是通过一个RECT数据类型来存储的,它所占的字节长度取决于实际所需要的位数。这个帧尺寸RECT数据中Xmin,Ymin的值总是0,Xmax和Ymax 定义宽高。帧率(FrameRate)定义一秒钟播放的帧数,但是这个帧率不是保证准确的,例如在CPU繁忙或速度慢的时候,就不准确。总帧数(FrameCount)指的是这个SWF文件的总帧数

UI8是指一个8位二进制(一个字节)代表的无符号整数
UI16是指一个16位二进制(二个字节)代表的无符号整数
同理UI32。
RECT是一串变长二进制数据结构,表示了5个数值,分别是定义位数
Nbits[5],xmin,xmax,ymin,ymax。一般可以表示两个数的范围。这里就是用来表示舞台的长和宽,前面5位二进制用来表示后面每一个数值的位数

用到的数据结构就都解释完了。我们拿一个例子来说明头的构造。我截图了一个SWF文件的二进制来进行解析:
这里写图片描述

我们对着官方的文件来进行分析下看看
前面三个字节,43 57 53 就是三个字符CWS,代表这是一个经过zlib压缩过的SWF,当然目前还有FWS未压缩,ZWS代表lzma压缩,三种格式。
第四个字节,官方说的是版本号,我们这里是0a,就是flash10了。
接下来是一个无符号32位整数,代表整个文件长度。因此这里就是用4个字节:10 bf 0a 00来显示文件长度了,但是由于这里字节采用了低位在前的编码规则,所以实际值应该是00 0a bf 10=704272,但是你会发现这和实际大小文件不匹配,为什么呢,因为这里的值是将压缩部分()解压缩之后,再加上文件头上这几部分计算出来的。
因此我们需要解压第8个字节之后的所有数据,解压后如下:
这里写图片描述

接下来就是一个RECT数据类型,我们需要替换成二进制编码如下
78就是0111 1000
前面5位表示的是位数,因此这里就是01111=15因为后面4个数就是每个占15位。因此这个RECT数据总位数就是5+(15*4) = 65位,由于一个字节是8位,因此这个数据总共占用字节数为65/8=8.125想上取整就是9个字节。因此这个RECT数据的字节就是:
78 00 05 5f 00 00 0f a0 00
转成二进制:
0111 1000 0000 0000 0000 0101 0101 1111 0000 0000 0000 0000 0000 1111 1010 0000 0000 0000
xmin = 000 0000 0000 0000 = 0;
xmax = 0101 0101 1111 000 = 11000(twips) = 550(pixels)
ymin = 0 0000 0000 0000 00 = 0
ymax = 00 1111 1010 0000 0 = 8000(twips) = 400(pixels);

*说明:SWF文件格式中所有的x-y 坐标信息都被存为整数,计量单位称作缇(twips)。在SWF
中,1缇是1/20个逻辑像素。*

因此这计算出来就是该SWF舞台宽度为550像素,高度为400像素。

接下用一个UI16,代表帧率00 19,低位在前,所以应该是19 00。同时这个帧率是一个8.8形式的定点小数因此帧率就是19.00换算成十进制就是25.00。

接下来就是帧总数,也是一个UI16:01 00,同样低位在前因此实际是00 01 = 1(帧)。

这样一个SWF文件的头就解析完了。

头这部分翻译也就结束了。

0 0
原创粉丝点击