转: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版本开始起有压缩的。
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