一个例子:解说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 如果你觉得好,请推广给您的朋友,谢谢您的支持!