由于 Macromedia 公司为了推广 Flash,而将 SWF 的文件格式公开,使得 SWF 文件再无秘密可言,从而害得 SWF 文件的加密、解密软件层出不穷。今天上网闲逛,发现 Adobe 公司同样公开了 Flash9 与 Flash10 的 SWF 文件格式,下来一看,大叫不好,是英文版的!发现网上没有中文版下载,只有几篇谈论 SWF 文件格式的文章,索性自己也写一篇吧。首先提供下载链接: Adobe官方SWF文件格式说明文档(pdf)下载:http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v9.pdf Adobe官方FLA文件格式说明文档(pdf)下载:http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v9.pdf pdf文件阅读器(没有的朋友请下载)下载:http://www.duote.com/soft/12426.html UltraEdit(用于查看和更改 SWF 文件)下载:http://www.duote.com/soft/68.html 首先,我创建了一个默认的 SWF 文件,即舞台大小为 550*400,帧频为 12,背景为白色,仅一帧的文件。首先用 UltraEdit 打开这个文件,我们可以看见二进制的文件结构: 每行自 ; 号以后(包括 ; 号)的字符都不用理会。首先给出 SWF 文件头的各属性列表: 字段 类型 说明 是否压缩标识: 版本号: 文件大小: 再说说文件大小的算法,我专门搞了个没有压缩的文件,大小为 45023 字节(43.9KB),这里显示为 DF AF 00 00 (压缩后输出文件实际大小为 29.4KB,但是还是显示 DF AF 00 00 数字),那么它是怎么表示文件大小的呢?“16 进制,并且低位在前。”其实这句话已经告诉我们了,真正的文件大小为 00 00 AF DF 即把这四个字符反过来就行,去掉 0 即 AFDF,用计算器一看 AFDF 的十进制就是 45023。最大可显示 FF FF FF FF,这表示的大小是 4GB,即硬盘文件系统 FAT32 支持的单个文件最大的大小。 帧大小: 帧频: 帧数: SWF 文件头介绍完了,但是我们发现文件还有近一半的数据,这是因为 SWF 文件头的各属性仅仅能提供 SWF 文件的基本属性,下面是一个 SWF 文件的基本构造: FileAttributes 标签(必有标签): SetBackgroundColor 标签(必有标签): ShowFrame 标签(必有标签): End 标签(必有标签): 注意: 自此,我们已经分析了一个完整的空白 SWF 文件的构成。 |
在 SWF文件格式探秘[一] 文章里没有说明 帧大小(指示舞台大小的RECT结构)的算法,这里给予补充,首先是默认的 SWF 文件(舞台大小为 550*400,帧频为 12,背景为白色,仅一帧)的二进制码: 再是自定义的 SWF 文件(舞台大小为 2880*2880,帧频为 12,背景为白色,仅一帧)的二进制码: 下面我们通过计算获取这两个文件的舞台大小: 默认文件: 取出:78 00 05 5F 00 00 0F A0 00 转换:01111000 00000000 00000101 01011111 00000000 00000000 00001111 10100000 00000000 分割:01111 000000000000000 010101011111000 000000000000000 001111101000000 0000000 把最后的不足 15 个数字的 0 舍去,把上面分割后的数字用 10进制 转换得: 转换:15 0 11000 0 8000 除第一个 15 不管外,这里的单位都不是像素,而是 twip(1像素 = 20twip),将其转换为像素得: 像素:0 550 0 400 通过上面的转换,我们得出了默认的 SWF 文件(舞台大小为 550*400,帧频为 12,背景为白色,仅一帧)的舞台大小,对比一下,正确! 为了保险,我们用同样的方法获取自定义的 SWF 文件(舞台大小为 2880*2880,帧频为 12,背景为白色,仅一帧)的舞台大小: 自定义文件: 取出:88 00 01 C2 00 00 00 70 80 00 转换:10001000 00000000 00000001 11000010 00000000 00000000 00000000 01110000 10000000 00000000 分割:10001 00000000000000000 01110000100000000 00000000000000000 01110000100000000 0000000 直接转换到像素大小得: 像素:0 2880 0 2880 一切 OK!书面表达有限,不知道你搞懂没有,以上算法来自一篇文章,下面给出那篇文章的链接:http://hi.baidu.com/jlby/blog/item/680825f44e70d7ee7709d7ed.html |