智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

二进制解析swf

Posted on 2010-04-28 17:56  Bill Yuan  阅读(3619)  评论(0编辑  收藏  举报

转自:http://www.cppblog.com/sleepwom/archive/2008/12/17/69652.html


首先得到swf的file_format_specification_v9.pdf,这个需要接受adobe公司的协议才可以看具体的google一下吧。
基础工具二进制查看工具,自己随便找个方便的吧,呵呵。

下面进入正题
未压缩swf十六进制原文如下:
46 57 53 09 4F 00 00 00 78 00 05 5F 00 00 0F A0
00 00 0C 01 00 44 11 08 00 00 00 43 02 FF FF FF
BF 00 23 00 00 00 01 00 70 FB 49 97 0D 0C 7D 50
00 01 14 00 00 00 00 01 25 C9 92 0D 21 ED 48 87
65 30 3B 6D E1 D8 B4 00 00 86 06 06 01 00 01 00
00 40 00 00 00

现在一点点的看
46 57 53 09 //FWS未压缩的swf9版本
文件头以三个字节的
0×46、0×57和0×53(FWS)或者0×43、0×57和0×53(CWS)开头。FWS表示swf文件没有被压缩,CWS表示swf文件从开始的8个字节之后都用开源的ZLIB压缩过。关于ZLIB在1950-1952年的Request for Comments(RFCs)中有介绍,swf6之后才使用的。第四个字节是版本信息,版本信息不实ascii码,而是8bit的数字。比如swf4就是0×04,而不是ascii 中的”4″(0×35).
4F 00 00 00 //文件未压缩时的大小79字节,
压缩后的swf,此值不变
78 00 05 5F 00 00 0F A0 00
//9位定义Rectangle长宽,也就是舞台宽高
//0111 1000 0000 0000 0000 0101 0101 1111 0000 0000
//0000 0000 0000 1111 1010 0000 0000 0000
//前5位 01111 ==>15 Nbits表示以后每次读15位
//000 0000 0000 0000 ==> 0 = Xmin
//0101 0101 1111 000 ==> 11000 = Xmax
//0 0000 0000 0000 00==> 0 = Ymin
//00 1111 1010 0000 0==> 8000 = Ymax
00 0C //0x000C ==> 0x0C00 ==> 0x0C (忽略后面) = 12 FrameRate
01 00 //0x0001 ==> 0000 0000 01 = 1 FrameCount
44 11 08 00 00 00 //flash8 or later FileAttributes
//metaInfo
43 02 FF FF FF //0x0243 ==> 0000 0010 01 = 9 SetBackgroundColor && 000011 = 3 背景颜色RGB

舞台中的元件暂不分析,大家自己研究吧,说来话长阿.... file_format_specification_v9.pdf这个有298页,呵呵

最后
40 00 //0x4000 ==>> 0x0040 ==>> 0000 0000 0100 0000 //Tag type = 1 = ShowFrame //length = 0
00 00 //0x0000 0x0000 0000 0000 0000 0000
//Tag type = 0 = end
//length = 0

 

FrameSize定义了swf文件显示的宽高,该信息存储在一个矩形结构中,就是说它的字节数可能会根据需要表示的坐标范围发生变化。FrameSize矩形包含Xmin和Ymin,两个参数的值都是0,还包含Xmax和Ymax,定义了舞台的尺寸。

FrameRate就是帧率了,实际上当flash运行了一个比较龊的cpu上的时候帧率是得不到保证的。

FrameCount表示swf文件的总帧数。