`
sealbird
  • 浏览: 586616 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

分析一个简单的swf文件[转贴]

    博客分类:
  • Flex
阅读更多
分析一个简单的swf文件[转贴]用Flash8新建一个fla文档,画布尺寸设为550*400,帧速为24帧/s,背景色为白色。第一帧的帧标签命名为"start",在动作面板上写上AS Code


stop();第2帧命名为"end",动作面板里写AS Code
prevFrame();。然后发布设置里:发布成FlashPlayer8,不压缩影片。


然后保存、输出swf。用UltraEdit32打开输出的swf,看到的画面如下图所示





下面我们来分析一些这些16进制数字的意义。

对于SWF中数据格式及数据存储方式不明白,请先到swf文件格式--基本数据类型中看看。

我们先看下关于SWF文件头的官方说明

区域 数据类型 含义
标识 UI8(8位二进制无符号整数) "F"表示该文件是未压缩的

"C"表示压缩文件(SWF6及后续版本支持)

标识 UI8 总是"W"
标识 UI8 总是 "S"
版本 UI8 SWF文件版本
文件大小 UI32 文件字节大小
画面尺寸 RECT 以twips为单位
帧速 UI16 8.8形式的定点小数
总帧数 UI16 总帧数


OK了,对应着它我们来分析下刚才生成的文件

数据 含义
46 "F",表示未压缩的
57 "W"
53 "S"
08 SWF文件版本为8
4C 00 00 00 文件大小为 4*16+12=76字节


再往后就是画布尺寸了,它是一个RECT结构的数据,我们先看下RECT结构说明:



名字 类型 含义
Nbits UB[5] 表示每个数字必须的二进制位数
Xmin SB[Nbits] x最小值
Xmax SB[Nbits] x最大值
Ymin SB[Nbits] Y最小值
Ymax SB[Nbits] Y最大值


我们生成的这个SWF文件中的数据是78 00 ...,我们先取前5位二进制,先确定好数据位数。78的二进制形式是:0111 1000,取前5位就是0111 1,它表示的十进制数是15=8+4+2+1,也就是说,Xmin,Xmax,Ymin,Ymax都要15位二进制数来表示,那么后面还要至少取15*4 - 3 =57位,又因为要符合字节对齐的规则,所以要取64位,也就是取 78 00 05 5F 00 00 0F A0 00,

然后我们把它转换成二进制后,在按照15位分割

0111 1||000 0000 0000 0000 ||0101 0101 1111 000||0 0000 0000 0000 00|| 00 1111 1010 0000 0||000 0000
然后我们可以算出

Xmin = (000 0000 0000 0000)2=(0)10

Xmax = (0101 0101 1111 000)2= (11000)10

Ymin = (0 0000 0000 0000 00)2 =(0)10

Ymax = (00 1111 1010 0000 0) 2= (8000)10

你也许会产生疑问,我们明明设定的画面尺寸是550*400的啊,这里为什么算出来的是11000 * 8000的啊?!别忘了,这里算出来的数字是以twips为单位的,一般情况下,1 twip等于1/20象素。

OK,接着往后解析,接下来就是帧速和帧数了,呵呵

数据 含义
00 18 表示帧速为16+8=24帧/S
02 00 帧数为2帧(再次提醒下,这是little-endian小尾存储噢)


OK.到此SWF文件头就结束了,接下来就是一个一个的Tag了。

我们先取16位:44 11,将小尾字节顺序转换成大尾顺序,就是11 44,然后取它的高10位是(0001 0001 01)2=(69)10,取它的低6位是(00 0100)2=(4)10.根据高10位的69,查询swf文件中的tag值和action值,可以知道TagType为69的是FileAttribute Tag。低6位的值4表示这个Tag数据大小占4个字节。因此我们取出接下来的后4个字节为:00 00 00 00,不要看它仅仅是0,其实它是有意义的,我们看下FileAttributes 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


这里说下FileAttributes Tag只在8及后续版本中有。

OK,Go on....

取下一个Tag,依然取2个字节43 02,转化成02 43,然后高十位=(0000 0010 01)2=(9)10,低6位=(00 0011)2=(3)10,高10位的9表明这是一个SetBackgroundColor tag,低6位的3表明数据占3个字节,OK,我们取出后续的3个字节是 FF FF FF,知道了吧,这就是我们设置的背景颜色:白色。

再取下一个Tag,3F 03,转化成03 3F,高十位=(0000 0011 00)2=(12)10,低6位=(11 1111)2=(63)10,高十位的12表示这是个DoAction标签,低6位的63表明数据长度有后续的4个字节决定,OK,我们取后续的4个字节为02 00 00 00,它表明这个Tag的数据长度占2个字节,OK,我们再取后续的2个字节是07 00,07表示Action代码,查Action代码就可以知道它表示的Action语句是ActionStop,也就是我们写在第一帧的代码AS Code


stop();,呵呵,亲切吧~。07后面的00,就表示DoAction Tag结束了。


Next Tag,FF 0A,转换成 0A FF,高十位=(0000 1010 11)2=(43)10,低6位=(11 1111)2=(63)10,高十位的43表明这是一个FrameLabel标签,也就是我们所说的帧标签。低6位的63表明数据大小由后续的4个字节指明,我们取出后续的4个字节为06 00 00 00,也就说该Tag的数据占6个字节,OK,继续取后续的6个字节,73 74 61 72 74 00,呵呵,将16进制值转换成字符串,就是"start",00,是字符串结束标志。

Next Tag ,40 00,转换成 00 40,高十位=(0000 0000 01)2=(1)10,低6位=(00 0000)2=(0)10,高十位的1表明这是一个ShowFrame Tag,也就是说当前帧的内容都已经准备好了,可以显示当前帧了。

NextTag , 3F 03,噫,很熟悉的样子,不错,前面刚刚遇到过吗,在出现AS Code


stop();的地方啊。这就是一个DoAction Tag,并且数据大小由后续4个字节表明,取后续4个字节:02 00 00 00,呵呵,跟上面的一样,接着取2个字节:05 00,05 表示的Action代码是ActionPrevFrame,也就是我们说的AS Code
prevFrame();了。00表示DoActionTag结束了。


Next Tag,FF 0A,呵呵,这也是刚刚出现的,表明这是一个FrameLabel标签,也就是我们所说的帧标签。低6位的63表明数据大小由后续的4个字节指明,我们取出后续的4个字节为04 00 00 00,也就说该Tag的数据占4个字节,OK,继续取后续的4个字节,65 6E 64 00,呵呵,将16进制值转换成字符串,就是"end",00,是字符串结束标志。

Next Tag,40 00,转换成 00 40,高十位=(0000 0000 01)2=(1)10,低6位=(00 0000)2=(0)10,高十位的1表明这是一个ShowFrame Tag,也就是说当前帧的内容都已经准备好了,可以显示当前帧了。

Next Tag 00 00,不用转换了,呵呵,高十位是0,低6位也是0,表明这是个EndTag,表示什么意义就不用我说了吧。



OK,一个简单的SWF文件就解析完了,好累啊。。擦把汗,再喝口水。。。
分享到:
评论

相关推荐

    动网转贴.e.rar

    【标题】"动网转贴.e.rar"是一个压缩文件,很可能包含了有关动网论坛或社区的相关资源、数据或用户帖子的备份。动网是中国早期知名的网络论坛软件之一,提供了丰富的社区功能,允许用户发帖、回帖、互动等。这个...

    转贴一个网络设计的例子

    转贴一个网络设计的例子

    论坛转贴 v1.0 JS版-源码.zip

    【标题】"论坛转贴 v1.0 JS版-源码.zip" 提供的是一个基于JavaScript的论坛转贴功能的源代码实现。JS版通常指的是使用JavaScript编程语言编写的版本,这表明该软件可能主要用于网页端,利用浏览器的JavaScript引擎...

    Struts-menu源码分析(转贴).rar

    Struts-menu是一个基于Apache Struts框架的菜单管理组件,它为Web应用提供了动态生成和管理菜单的功能。在分析Struts-menu的源码时,我们可以深入理解Struts框架的工作原理、MVC模式的应用以及如何实现自定义标签库...

    易语言动网转贴

    综上所述,"易语言动网转贴"源码涵盖了文件操作、窗口交互、数据校验等多个方面,是实现论坛帖子迁移的一个实例,对于理解和学习易语言以及窗口编程有很大的帮助。通过深入研究这段代码,开发者可以了解到如何利用...

    算法设计与分析 转贴 算法试卷收集 3.doc

    * 拟阵是指一个数组的子集,其中每个元素都是该数组的一个元素。拟阵 M 中极大独立子集有哪些特点是指该子集中的元素互不相同且它们的结合是该数组中的最大子集。 * NP 完全语言和 NP 完全语言类是指那些在多项式...

    BFC UBB转贴器

    这是一个类似论坛转贴工具的小程序,可以将剪贴板中的HTML代码转换为论坛支持的UBB代码。 由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 <br...

    易语言动网转贴.rar

    由于压缩包文件名为“易语言动网转贴.rar”,我们可以推测这可能是一个软件开发资源,包含了一些源代码、教程或者是相关插件。 在易语言中,"动网"通常指的是动网论坛,这是一个曾经非常流行的网络社区平台。"转贴...

    以u-boot为例介绍如何在MDK下调试elf格式文件.pdf(转贴附件)

    U-Boot(Universal Boot Loader)是一个开放源代码的引导加载程序项目,支持多种处理器架构(如ARM、PowerPC等)和操作系统(如Linux、NetBSD等)。它具有强大的功能集,例如支持网络启动、闪存操作以及通过串行...

    动易系统的论坛转贴工具 -ASP源码.zip

    标题中的“动易系统的论坛转贴工具 -ASP源码.zip”揭示了这是一个基于ASP(Active Server Pages)编程语言开发的论坛转贴工具的源代码。ASP是微软公司推出的一种服务器端脚本环境,用于创建动态交互式网页。这个工具...

    易语言源码动网转贴.rar

    对于易语言的学习者来说,这是一个宝贵的实践案例,可以帮助他们提升编程技能,并了解实际项目中的问题解决策略。同时,对于任何想要了解论坛数据迁移的开发者来说,这也是一个值得参考的资源。

    动易系统的论坛转贴工具

    当用户将带有原网址的帖子分享到其他论坛,就相当于为原网站创建了一个自然的外部链接,即反向链接。搜索引擎会将这些反向链接视为对原网站质量的认可,从而提高其在搜索结果中的排名。因此,动易系统的论坛转贴工具...

    windows 下的grep,转贴

    在描述中提到,“在windows下的grep命令,查找文本的好工具,方便shell人员”,这暗示了grep对于经常在命令行环境中工作的人来说是一个非常实用的工具,可以帮助他们快速定位和分析大量文本数据。 在Windows环境下...

    jquery的转贴功能实现

    在网页开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理和Ajax交互等任务。在本主题中,我们将深入探讨如何利用jQuery实现“转贴”功能,这是一种常见的社交媒体分享功能,允许用户将...

    行业资料-电子功用-全自动导电布成型转贴穿管设备及工艺的介绍分析.rar

    标题"行业资料-电子功用-全自动导电布成型转贴穿管设备及工艺的介绍分析.rar"表明这是一份关于电子行业中的特定应用——全自动导电布成型转贴穿管设备及其相关工艺的详细介绍。导电布是一种具有导电性能的材料,常...

    案例解析SAP_第二章案例解析SAP_第二章(转贴)

    由于文件名仅有一个".swf"文件,我们可以推测这是一个Flash动画或互动教程,通常用于视觉展示和交互式学习。 在SAP的第二章中,可能涵盖了以下几个关键知识点: 1. **SAP模块介绍**:SAP系统由多个模块组成,如...

    电子政务-导电泡棉转贴装置.zip

    在“导电泡棉转贴装置”这个特定的场景下,我们可能是在讨论一种用于电子政务设备或系统中的特殊组件。 导电泡棉是一种具有导电性能的泡沫材料,通常用于电子设备的屏蔽、接地或防静电保护。在电子政务设备中,这种...

    Html处理软件、转贴工具(源代码)

    去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的

Global site tag (gtag.js) - Google Analytics