swf文件结构

来源:互联网 发布:hibernate数据库并发 编辑:程序博客网 时间:2024/05/01 16:25

转:http://apps.hi.baidu.com/share/detail/924692

SWF文件头(the swf header)

此部分有很多人翻译过。所以讲点具体的。

用十六进制查看软件查看一个SWF文件。如首先看到的是

46 57 53 09 95 09 00 00 78 00 05 5F 00 00 0F A0

00 00 0C 03 00 44 11 08 00 00 00 43 02 FF FF FF

字节 3    String      格式      0x465753   “FWS”

字节 1     Byte     版本号    09         swf9

字节 4     Uint 未压缩时的文件大小 95 09

字节 4-11 Rect    屏幕大小 7800055F00000FA000

字节 2    Fixed(8.8) 桢频      因为基本没有小数,所以一般为000C(12桢/s)

字节 2     Uint       桢数      0300 一共3桢

首先前三位,对应ASC的字符串是FWS,如果是从高位到低位置,即是SWF,表示一个未经过压缩的SWF文件。

这三位只有两种情况:

0x465753 FWS   未经压缩的SWF文件
0x435753 CWS   即是压缩过的SWF文件
SWF的压缩/解压缩方式是从第8位(开头第一位为0算起),标准的Zlib方式。Zlib在AS3中,已经有成形的方法,byteArray.uncompress()。从swf6版本开始起有压缩的。

第3位的09表示版本号。对应着swf的版本号。(此数值是用来读取swf中的版本号的。对应的作用不大,如一台电脑里注册有flashplayer8和flashplayer9两种版本的话,而此处版本号是8,那么默认会用flashplayer8打开。仅此而已。如果本来是swf9的文件,将此处改为0x08,那么很可能用flashplayer8打开了swf9的文件,而导致部分功能不能使用。Swf开放的文件格式,理论上是向下兼容,甚至如果不是新的函数,还可以向上兼容的。实际中可能有些BUG,如前段时间flashplayer10播放swf8文件显示为空白)

04-07 是一个32位正整数(Uint32),表示该swf文件未压缩时的字节数。该参数基本上也只是供读取的文件信息,修改此处并没其他作用。

之后的78 00 05 5F 00 00,,,为Rectangle方式的FrameSize,表示舞台大小。存储方式是twips,1twip代表1/20象素,当取模不等时,表现为边缘模糊(位图中,显示的最小单位是1象素,而矢量转位图时,假设矢量中的数值是1.05,显示为一象素并且边缘有0.05alpha的模糊。这里也能说明在flash里,怎么画,怎么写as,最后输出,肯定最小单位刻度是0.05)

这里把Rectangle的解析提前讲。


Nbits 5bits 指明后面的数据占几字节。

之后4个数据分别是Xmin Xmax Ymin Ymax。(这里和flash的Rectangle类不一样,Rectangle里为Xmin,Ymin,width,height)

首先我们用Flash CS3建两个空白未压缩的swf,一个舞台尺寸是2880x2880,一个是1x1(最大和最小值)。用二进制打开后比较,发现不同的地方为

2880x2880

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

46 57 53 09 25 00 00 00 88 00 01 C2 00 00 00 70

80 00 00 0C 01

1x1

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

46 57 53 09 25 00 00 00 30 0A 00 A0 00 0C 01 00

44 11 08 00 00 00 43 02 FF FF FF 40 00 00 00

可以看出来2880x2880的Tag,占了11个字节,而1x1的才占5个字节

显然长度是不固定的,必须解析第一个才能知道长度。

后面每个数据长度为   l=08位的数值>>3 //此长度为2进制

所以总长度是 length=固定值5+4xl

下面验证一下

1x1时
var l0=0x30>>3   //每个的长度         6
var l1=5+4*l     //bit总共数据位
     29
var l2=Math.ceil(l1/8)   //字节位数
   4
var l3=l2*8              //bit总位数 32

(0x300A00A0).toString(2) //110000000010100000000010100000

因为直接转换只有30位,所以一定要补位(在最前添加00)。补位后按6个分割如下

前5位 Nbit =parseInt(“00110”) //转换成2进制为6

Xmin= parseInt(“000000”) //0

Xmin= parseInt(“010100”) //20   1pixel

Xmin= parseInt(“000000”) //0

Xmin= parseInt(“010100”) //20 1pixel

00110 000000 010100 000000 010100 000

之后的是两个短tag,后面有介绍

44 11 08 00 00 00 //Fileattribs 1000 //含有MetaData标签

43 02 FF FF FF    //setBackGroundColor 0xFFFFFF

Fileattfibs tag

数据类型

含义

Tag头

RECORDHEADER

TagType=69

Reserved

UB[3]

总是0

hasMetaData

UB[1]

为1表示含有MetaData标签

为0表示不含

Reserved

UB[3]

总是0

UseNetWork

UB[1]

如果为1,则在本地加载时该文件有网络权限。为0,则在本地加载时该文件只有本地权限。

Reserved

UB[24]

总是0

注:

bit 二进制最小的单位

byte 十六进制最小单位,所以1byte=8bit


原创粉丝点击