一个例子:解说swf文件的Header Tag DefineBitsJPEG2 DoAction DefineSound

 

用一个能用16位查看东西的软件,打开swf。我使用的是ultraedit-32,习惯了。哈哈

你就能看到一组16进制的数据。

46  57  53  08  c4  f1  5e  00  80  00  02  51  c0  00  01  96  40 

00  00  1e  01  00 44  11  00  00  00 43  02  ff  ff   ff| 7f   05

7a  c8  15  00  01  00  ff d8| 3f  03 69  00  00  00 ‎88  36  00

07  00  7a  6d  74  78  74  31  00  e5  bc  80  e5  8f  a3  e6  9e

a3  00  7a  6d  74  78  74  32  00  e5  a4  a9  e5  a4  a9  e5  ad

a6  e4  b9  a0  00  74  78  74  31  00  74  65  78  74  00  74  78

74  31  00‎ 96  04  00  08  00  08  01‏ 3c ‎96 04  00  08  02  08

03‎ 3c‎ 96  02  00  08  04‎ 1c ‎96  04  00  08  05  08  00‎ 1c‎ 4f

96  02  00  08  06‎ 1c ‎96  04  00  08  05  08  02 ‎1c‎ 4f‎ 07 ‎00

00 44  0b  26  00  00  00 bf  03  b8  e0  00  00  01  00  26  40

Dc  04  00  00 ‎00

是不是很晕。不要晕了。慢慢看。

你看,前3个,不是 46 57 53 就是 43 57 53 ,代表的是FWSCWSfws是未使用ZLIB压缩的,cws是使用了的,有为什么区别,一个容量小了,一个不变啊。不过,这样就说明,一个要转换,一个不用。ps:压缩功能是从flash6开始有的,之前都没有。

 

打字真累,先休息,等下继续。

----------继续---------

后面有一个数字 08 或者是其他的数字,就是flash 的版本,8就是flash86就是flash6。恩恩

明白了吧。

现在,我们就明白了前4组数字的意思了。

 

开始,后四个数字呢,代表了swf的字节数,要注意呢。他是倒序的。

 

比如: c4 f1 5e 00

实际的字节就是 00 5e f1 c4 .转成10进制(你可以用科学计算器转)就是6222276字节。恩恩,对对,就是那么大。

 

好了吧。明白了?

下一个,说说swf文件的尺寸。

现在已经解析了前面8个数组了,从第九个数组开始,我这个是

80 00 02 51 c0 00 01 96 40 00 .......

 

开始跟着我分析

8010000000 16进制转2进制)

取前面5位(不要问我为什么,我也不知道。)

10000162进制转10进制)

 

我们在重新算一下需要的数组数,4×1656969/8=8.625==9

这样,9个数组就好了。

80 00 02 51 c0 00 01 96 40这个就够了。

ok,明白了,它是以16位来区分的,意思就是,它每16个数字一组,来确定其尺寸。

80 00 02 51 c0 00 01 96 40.......2进制就是

 

10000000 00000000 00000010 01010001 11000000 00000000 00000001 10010110

 

重新划块。

 

10000    0000000000000000    0100101000111000    0000000000000000    0011001011001000    000

 

第一块是定义数位

第二块是xmin0

第三块是xmax010010100011100019000,然后除以20(这个是别人定的,我也不好说什么),950出来了。哈哈,可见xmax950

这样一算,widthxmaxxmin950

 

如此类推,第四块是ymin0,第五块是ymax650。所以,height650

 

第六块放弃,丢掉。

 

这样,swf的尺寸就出来了,950×650

 

明白了吧?

 

到现在为止,我们处理了多少个数组了?17,哈哈,好有效啊。

下面,开始处理下面2个数组

 

下面2个数组是 代表了帧频。我的是00 1e,一换算,就是30。恩恩。很好。

 

接下去2个数组是 代表了帧数。我的是01 00 ,这个也要倒序来算,所以,就是1,正确。

 

好了,下一个数组开始,就不是文件头了。开始真正的解析swf了。

 

请在详细看看最上面的文章,好好理解一下什么是tag,还有tag的类型。

 

接下来就来讲解这个tag了。

 

恩,我们之前已经读到44 11 00 00 00。。。了。

开始分析

由于是字节,要高低位之分,低位在前,高位在后。。(什么是高低位,我这么知道。我就知道这样做而已。)

看这个 44 1111 44 0001000101000100 4420,哈哈。但是由于要判断他的类型,得2进制的东西向右移6位,就是作去掉后六位的意思。这样,实际上就是000100010169 看到了,它的tag类型是69,下面我会介绍类型分别代表什么意思的。

 

后面去掉的那六位,0001004,不是63,就是二进制的时候不是111111,所以,是短tag,这个就是字节数。

所有,第一个tag包含的东西有(短tag类型:2+length[6bit位决定]

44 11 00 00 00 00 

 

现在来说明一下,tag类型69是代表了什么。

FileAttributes----不是很明白这个是什么,字面意思是文件属性,而且,后面的属性均为0,不清楚。。

 

43 02 ff ff ff ...看明白吗?

不用明白,解析出来后就知道了。

43 0202 4300000010 01000011

分开解读,0000001001 000011 分别是 tag类型9,字节数为3。恩

意思就是,他的类型是SetBackgroundColor,就是控制背景颜色的了。后面3个字节就是它的属性。

所以,ff ff ff 就是他的背景颜色,可见,是255 255 255的白色。

 

继续研究。研究到 7f 05 7a c8 15 00

开始研究文件头

7f 05 =05 7f =0000010101111111

分开 0000010101 111111

tag类型000001010121,为DefineBitsJPEG2,哈哈,找到图片了。

长度11111163,终于出现了,长字节型的,以接下去4个字节为它的大小。(长Tag类型 2+4+length[4个字节(bytes)决定]

7a c8 15 0000 15 c8 7a1427578

图片大小出来了。。

 

怎么多了2个字节?

奇怪了。。

对比一下,图片的文件头是 ff d8

而这个却是01 00 ff d8,可见,虽然不知道前面2个字节是干什么的,但是,去掉。哈哈。

这样就出来了。

 

图片就这样被我导出来了。。

 

今天我们不来讲到处音乐。

来讲查看代码,就是查看as了。

 

这个就是包含几普通语句的代码。当然,为了容易解释,我都是用未压缩的swf

 

开始解析。

 

46 57 53 08 没有问题,fws形式的flash8版本的swf

 

24 01 00 00 00 00 01 24292 字节。

 

80 00 02 51 c0 00 01 96 40 代表了他的尺寸,950×650,不懂的看前面。

 

00 1e 30/

 

01 0000 011

 

44 11 00 00 00 00 FileAttributes 不明白

 

43 02 ff ff ff =背景颜色是 白色

 

3f 0303 3f 00000011 00111111 0000001100 111111 tag 类型 12 ,长字节,算后面四个

 

69 00 00 0000 00 00 69105 个字节就是这tag类型12 的东西。

 

tag类型12 DoAction,就是语句了。。

 

DoAction结构:

Field              Type                        Comment

Header          RECORDHEADER Tag              type = 12

Actions        ACTIONRECORD [zero or more]  List of actions to perform(seefollowingtable,ActionRecord)

ActionEndFlag      UI8 = 0                  Always set to 0

 

看后面的东西,叫做ACTIONRECORD,可以为0 也可以很多(说明书这样写的)。。

 

ACTIONRECORD结构:

Field               Type                          Comment

ActionCode          code = UI8         An action code (see following)

Length           If code >= 0x80 UI16   The number of bytes (after this) inthe ACTIONRECORD.

 

后面是 88 36 。。。

 

查到0x88ActionConstantPool,动作常数池?算了,不翻译了。。就是这个。

 

先看看ActionConstantPool结构:

Field                  Type               Comment

ActionConstantPool      UI8               Action = 0x88

Count                   UI16              Number of constants to follow

ConstantPool         STRING[Count]        String constants

 

后面是 36 00 00 36 54个字节,是这个池子里面的东西。。

开始看池子里面的东西了。

 

再看看STRING结构:

Field         Type                   Comment

String       UI8[zero or more]       Non-null string character data

StringEnd     UI8                    Marks end of string; always zero

                                    结束标记,碰到0x00就结束)

继续,

 

07 00 7a 6d 74 78 74 31 00 e5 bc 80 e5 8f a3 e6 9e a3 00

 

开始读取

07 (注释:响铃) (此处有疑问,应该像后面的一样把??)

00 =分隔符(StringEnd字段)

7a 6d 74 78 74 31 zmtxt1 (对照ASCII对照表看)

00 =分隔符

e5 bc 80 e5 8f a3 e6 9e a3=开口枣 (这个怎么来的?这个。。。这个。。。啊,看,飞碟。。胡编,总之这里就是一个字符串类型的数据)

接着

00

7a 6d 74 78 74 32 zmtxt2

00

e5 a4 a9 e5 a4 a9 e5 ad a6 e4 b9 a0=天天向上

00

74 78 74 31 txt1

00

74 65 78 74 = text

00

74 78 74 31 = txt2

00

 

好,刚好54个字节。

后面就不在是这个池子里面的东西了。

 

96 这个由于还在105 字节内,所以,还是action,看看他的类型是什么。

ActionPush,汗一个,是动作推。。。。不要翻译了,就是放置了。

04 这个是。。。。

晕了。。

先看看ActionPush结构:

Field                 Type               Comment

ActionPush           ACTIONRECORD      The ActionCode in ACTIONRECORDis0x96.The Length in ACTIONRECORD represents the total number of type and value bytes in this ActionPush.

 

                                       [ACTIONRECORD 中的 Length 还反应着ActionPush 的长度。]

 

Type                  UI8              0 = string literal

1 = floating-point literal

 

The following types are available in SWF 5 andlater:

2 = null

3 = undefined

4 = register

5 = Boolean

6 = double

7 = integer

8 = constant 8

9 = constant 16

String          If Type = 0, STRING     Null-terminated character string

Float           If Type = 1, FLOAT    32-bit IEEE single-precision little-endian floating point

value

RegisterNumber  If Type = 4, UI8      Register number

Boolean         If Type = 5, UI8      Boolean value

Double          If Type = 6,DOUBLE    64-bit IEEE double-precision little-endian doublevalue

Integer         If Type = 7, UI32     32-bit little-endian integer

Constant8       If Type = 8,  UI8      Constant pool index (for indexes < 256) (see ActionConstantPool)

Constant16      If Type = 9, UI16     Constant pool index (for indexes >= 256) (see ActionConstantPool)

 

96 就是push ,就是var的意思了

 

04 00= 4 ACTIONRECORD 中的 Length,指明了ActionPush 的长度

即下面的(08 00 08 01

08 Constant8是后面的索引index的意思

 

00 就是指池子里面的第1个常量,就是说是 zmtxt1,

 

08 索引池子(同上)

 

01 2个常量 开口枣

 

3c  ActionDefineLocal,看解释是说,一个常量被定义之后的信息.

 

这样看来,就是这样解释

 

push zmtxt1 开口枣

 

直接弄成flash语句就是:

var zmtxt1="开口枣"

 

同理

96 就是push ,就是var的意思了

 

04 00= 4 ACTIONRECORD 中的 Length,指明了ActionPush 的长度

即下面的(08 02 08 03

08 Constant8是后面的索引index的意思

 

02 就是指池子里面的第3个常量,就是说是 zmtxt2,

 

08 索引池子(同上)

 

03 4个常量 天天向上

 

3c ActionDefineLocal,看解释是说,一个常量被定义之后的信息.

 

这样看来,就是这样解释

 

push zmtxt2 天天向上

 

直接弄成flash语句就是:

 

var zmtxt2="天天向上"

 

后面呢

 

96

02 00 = 2 ACTIONRECORD 中的 Length,指明了ActionPush 的长度

 

08 04, 就是指池子里面的第5个常量,就是说是txt1

 

1c ActionGetVariable,获取参数,就是说txt1的参数是获取的,

 

就是说,

txt1=

 

就这样,没有後文了,继续解读

 

96 push

04 00 = 4熟悉的影子

08 05 =text

08 00 = zmtxt1

 

1c 获取参数

4f ActionSetMember,就是把这个参数设置到 member就是说设置到场景里面.

 

这样,回忆flashas,可得

就是说,

txt1.text=zmtxt1

 

 

后面同理

96

02 00 = 2 ACTIONRECORD 中的 Length,指明了ActionPush 的长度

 

08 06, 就是指池子里面的第7个常量,就是说是txt2

 

1c ActionGetVariable,获取参数,就是说txt2的参数是获取的,

 

就是说,

txt2=

 

就这样,没有後文了,继续解读

 

96 push

04 00 = 4熟悉的影子

08 05 =text

08 02= zmtxt2

 

1c 获取参数

4f ActionSetMember,就是把这个参数设置到 member就是说设置到场景里面.

 

这样,回忆flashas,可得

就是说, 解读出

txt2.text=zmtxt2

 

 

07 00....

后面的东西下次在说..

今天真的累了..

想想...

07 ActionStop,就是stop()

...

 

就是这样了..

 

计算一下,加上后面的00分隔符,就是105个字节

,语句解析完毕

 

整个语句就是

 

var zmtxt1="开口枣"

var zmtxt2="天天向上"

txt1.text=zmtxt1

txt2.text=zmtxt2

stop()

哈哈,简单吧...

强吧...

真的就是这样哦..

hoho

 

今天就来解析所谓的音乐了...

 

这个...

mp3为例,如果是wav,好像到flash里面也是mp3.

不管了,

一齐来看看就知道了.

 

46 57 53 08 没有问题,fws形式的flash8版本的swf

 

24 01 00 00 00 00 01 24292 字节。

 

80 00 02 51 c0 00 01 96 40 代表了他的尺寸,950×650,不懂的看前面。

 

00 1e 30/

 

01 0000 011

 

44 11 00 00 00 00 FileAttributes 不明白

 

43 02 ff ff ff =背景颜色是 白色

 

ok,接着

 

44 0b 26 00 00 00

 

44 0b =0b 44==0000101101000100=0000101101 000100,tag类型 45,长度 4,

tag 类型45 SoundStreamHead2,恩恩音乐的.

 

-----------------休息---------------

 

4,就是后面4个直接就是属性

看看SoundStreamHead2的结构:

 

26 00=0010011000000000= 0010 01    1    0        0000    00    0    0

分别代表了.Reserved=0010=3,好像没有什么用

PlaybackSoundRate=01=1,就是11hz....

PlaybackSoundSize=1=1就是 16bit....

PlaybackSoundType=0=0,就是mono

 

StreamSoundCompression=0000=0,uncompressed,未压缩.

StreamSoundRate=00 ,5.5hz...

StreamSoundSize=0,8bit

StreamSoundType=0 ,mono

 

00 00 代表了StreamSoundSampleCount

 

这些..全部不懂得是为什么...不解释了..

 

bf 03=03 bf=0000001110111111=0000001110 111111 ,tag类型是14,长字节,后面4个字节是大小.

 

tag 14,Define Sound,这个就是声音了.

 

b8 e0 00 00=00 00 e0 b8=57528 音乐有57528字节大小.

恩恩

看看Define Sound的结构:

 

01 00 =00 01 =1,是这个声音的id

 

26=00011010=0001 10 1 0,    0001=1,代表这个声音的类型是ADPCM,    10=3,代表了这个声音的频率是44hz,    1=1,代表了16bit, 0=0,代表了声音是mono

 

40 dc 04 00 ,这四个嘛...SoundSampleCount,Number of samples. Not affected by mono/stereo setting; for stereo sounds this is the number of sample pairs.

 

不是很明白..

 

但是不影响..

继续

 

00 这个是SoundData,The sound data; varies by format.

也是不明白,...

 

后面那个00,肯定就是休止符了...

 

然后后面57528-9=57519字节就是声音数据了...

就是这样,声音就这样导出来了..

 

恩恩...

 

 

疑问还是狠多,但是,还是成功了嘛....

 

好了

 

今天就到这里..

其实,说了那么多了。。

基本都应该入门了。

 

 

我就不讲那么多了。。

现在,把这本英文版的 swf说明说给你们。自己开始研究吧。

我也该收手了。

 

现在来讲一下,为什么在这个板块说这个。

主要就是,zcom的模板就是通过直接修改swf来实现的。现在,大家都明白了吧。我就不说什么了

 

本文由豫新论坛提供http://bbs.yuxinnet.cn 如果你觉得好,请推广给您的朋友,谢谢您的支持!

 

转载于:https://www.cnblogs.com/qdlgx/archive/2008/09/03/1282534.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值