• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
-7℃→百一的生活
记录学习过程中的点点滴滴; 记性不好,特别需要这么一个博客。 为自己也为别人! 一起分享吧!(*^__^*) 嘻嘻……
博客园    首页    新随笔    联系   管理    订阅  订阅

一个例子:解说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 ,代表的是FWS和CWS,fws是未使用ZLIB压缩的,cws是使用了的,有为什么区别,一个容量小了,一个不变啊。不过,这样就说明,一个要转换,一个不用。ps:压缩功能是从flash6开始有的,之前都没有。

 

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

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

后面有一个数字 08 或者是其他的数字,就是flash 的版本,8就是flash8,6就是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 .......

 

开始跟着我分析

80=10000000 (16进制转2进制)

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

10000=16(2进制转10进制)

 

我们在重新算一下需要的数组数,4×16+5=69,69/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

 

第一块是定义数位

第二块是xmin=0

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

这样一算,width=xmax-xmin=950

 

如此类推,第四块是ymin=0,第五块是ymax=650。所以,height=650

 

第六块放弃,丢掉。

 

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

 

明白了吧?

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

开始分析

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

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

 

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

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

44 11 00 00 00 00 

 

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

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

 

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

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

43 02=02 43=00000010 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类型0000010101=21,为DefineBitsJPEG2,哈哈,找到图片了。

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

7a c8 15 00=00 15 c8 7a=1427578

图片大小出来了。。

 

怎么多了2个字节?

奇怪了。。

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

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

这样就出来了。

 

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

 

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

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

 

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

 

开始解析。

 

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

 

24 01 00 00 =00 00 01 24=292 字节。

 

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

 

00 1e =30帧/秒

 

01 00=00 01=1 帧

 

44 11 00 00 00 00 =FileAttributes 不明白

 

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

 

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

 

69 00 00 00=00 00 00 69=105 个字节就是这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 。。。

 

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

 

先看看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 24=292 字节。

 

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

 

00 1e =30帧/秒

 

01 00=00 01=1 帧

 

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 如果你觉得好,请推广给您的朋友,谢谢您的支持!

 

posted @ 2008-09-03 07:37  青岛小帅哥  阅读(2371)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3