Flash各種實例剖析我們都看過不少,不過你有沒有想過swf文件內部到底是怎樣的結構呢?不少閃客都想製作自己的Flash播放器,除了對控件的掌握和使用,更需要我們對swf文件的結構有深入的瞭解。於是我用WinHex分別打開一個swf文件和由它生成的exe文件,經過仔細分析對比後,我不僅發現了swf文件轉變成exe可執行文件的祕密,並且將Flash自帶播放器具備而控件卻無法實現的那些功能的謎底也同時解開了。
既然要“解剖”swf文件我們就要有“解剖”工具,我使用的是WinHex 9.2,你也可以用其它的二進制編輯器來查看。
一、swf文件結構和信息
左側“偏移量”一格代表一個字節,相同或相關功能的字節用同一種背景色表示。偏移量用十進制數表示,每個字節的值均用十六進制數表示。
偏移量 |
含義
|
0 |
固定爲46 57 53,也就是字母‘F’‘W’‘S’ 也有的文件爲43 57 53,也就是字母‘C’‘W’‘S’ |
1 |
2 |
3 |
文件版本號
在播放一個swf文件之前,可根據此值與當前播放器控件的版本號比較,看是否需要更新。
(Flash MX 生成的swf文件版本號爲6)
|
4 |
文件大小
正確的文件大小應該是按7、6、5、4的順序來排列得到的十六進制數,單位是字節。 |
5 |
6 |
7 |
8 |
影片寬高數據控制碼
(詳細說明見後) |
9 · · · |
影片的寬度與高度數據存放區
所佔字節數由控制碼決定 (詳細說明見後) |
N1 |
(作用不詳) |
N2 |
影片放映速度
設計時指定的速度,單位是(幀/秒)。 |
N3 |
影片的總幀數
正確的幀數應該是按N4、N3的順序排列得到的十六進制數。 |
N4 |
N5 |
(作用不詳) |
N6 |
(作用不詳) |
N7 |
背景色中紅色值 |
N8 |
背景色中綠色值 |
N9 |
背景色中藍色值 |
· · · |
影片數據區 |
|
文件的最後四個字節爲40 00 00 00 |
|
|
|
注:因長寬控制碼所佔字節數不確定,故其後的偏移量無法用具體數字來表示,改用N1、N2、N3等符號。
以上表格中所展示的是swf文件的結構,通過它你就能很清楚地明白哪部分對你編程有用,哪部分可以解決長期困繞的你的問題,怎麼樣?是不是開始偷着樂了?彆着急 ,繼續看更精彩的還在後面呢!
二、swf文件中記錄影片寬、高的方式
前面表中第八個字節“影片寬高數據控制碼”指的是下表中控制碼一欄中的數字。第九個字節至第N個字節“影片的寬度與高度數據存放區”指的是下表中控制碼右邊的那一行數字。由於控制碼的不同,寬度與高度的數據存放區的字節長度也不同。
下表中將控制碼所在的字節分爲兩部分(高四位和低四位)。高低位不同的組合決定了數據區佔用字節數以及不同的高度算法。
相應的控制碼後的藍色條表示數據區所佔用的字節。五星代表有效數據(注意每個五星只佔半個字節),其中前面幾個連續的五星對應的數據記錄了高度值,後面幾個連續的五星 對應的數據記錄了寬度值。
將連續的五星所在位置的數(十六進制)組合起來,得到四位或六位的十六進制數,將此數轉換成十進制數,白色五星得到的數除以10就是影片寬度數值,紅色五星得到的數除以40就是影片高度數值。
我對每一種控制碼都給出一個具體例子,請對比文件中相應的字節和實際的寬度和高度值。
控制碼 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
寬×高 |
50 |
★ |
★ |
★ |
★ |
|
★ |
★ |
★ |
★ |
|
|
|
|
|
|
|
|
|
18×18 |
0 |
0 |
B |
4 |
0 |
0 |
0 |
B |
4 |
0 |
|
|
|
|
|
|
|
|
58 |
|
★ |
★ |
★ |
★ |
|
★ |
★ |
★ |
★ |
|
|
|
|
|
|
|
|
36×18 |
0 |
0 |
5 |
A |
0 |
0 |
0 |
0 |
B |
4 |
0 |
0 |
|
|
|
|
|
|
60 |
|
★ |
★ |
★ |
★ |
|
|
★ |
★ |
★ |
★ |
|
|
|
|
|
|
|
100×48 |
0 |
0 |
3 |
E |
8 |
0 |
0 |
0 |
1 |
E |
0 |
0 |
|
|
|
|
|
|
68 |
|
|
★ |
★ |
★ |
★ |
|
|
★ |
★ |
★ |
★ |
|
|
|
|
|
|
160×100 |
0 |
0 |
1 |
9 |
0 |
0 |
0 |
0 |
0 |
3 |
E |
8 |
0 |
0 |
|
|
|
|
70 |
|
|
★ |
★ |
★ |
★ |
|
|
|
★ |
★ |
★ |
★ |
|
|
|
|
|
400×320 |
0 |
0 |
0 |
F |
A |
0 |
0 |
0 |
0 |
0 |
C |
8 |
0 |
0 |
|
|
|
|
78 |
|
|
|
★ |
★ |
★ |
★ |
|
|
|
★ |
★ |
★ |
★ |
|
|
|
|
550×400 |
0 |
0 |
0 |
5 |
5 |
F |
0 |
0 |
0 |
0 |
0 |
F |
A |
0 |
0 |
0 |
|
|
80 |
|
|
|
★ |
★ |
★ |
★ |
|
|
|
|
★ |
★ |
★ |
★ |
|
|
|
1600×1200 |
0 |
0 |
0 |
3 |
E |
8 |
0 |
0 |
0 |
0 |
0 |
2 |
E |
E |
0 |
0 |
|
|
88 |
|
|
★ |
★ |
★ |
★ |
★ |
★ |
|
|
|
|
★ |
★ |
★ |
★ |
|
|
2880×2880 |
0 |
0 |
0 |
1 |
C |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
7 |
0 |
8 |
0 |
0 |
0 |
注:由於Flash的圖像尺寸的限制,控制碼只有以上幾種情況,編程時只需對以上幾種情況進行判斷,分別做不同的計算處理。
三、swf與exe文件之間的互相轉換
用Flash自帶的播放器可將一個swf文件轉換成一個可自動播放的exe文件,這個轉換過程只不過是在該swf文件前後加上播放器的代碼而達到的,當我們知道了這個轉換原理後,我們就可以實現由exe向swf轉換了。
對由swf文件轉換成的exe文件進行分析後,我發現Flash自帶的播放器只是對swf文件做了如下幾步修改:
1、在一個swf文件前加上exe文件頭,共5BFFF字節; 2、接下來是完整的swf文件內容; 3、再接下來四個字節是exe文件的結束標誌; 4、最後是記錄swf文件大小的四個字節。
將一個Flash影片的exe文件轉換成swf文件,我們只需把swf文件轉換成的exe文件的過程反着做一下就可以了,也就是將上述1、3、4步驟加上的東西 刪除掉就可以了。
詳見下表:
↓ |
偏移量
|
字節內容
|
備註
|
|
0 |
4D 5A 90···00 00 |
exe文件頭 |
· · · |
5BFFF |
|
5C000 |
46(或43) |
swf文件頭 |
5C001 |
57 |
5C002 |
53 |
5C003 |
(可能爲05、04、03、02、01) |
swf文件版本號 |
|
5C004 |
記錄swf文件大小的四個字節 |
|
5C005 |
5C006 |
5C007 |
|
· · · |
swf文件內容 |
|
|
40 |
swf文件的結束標誌 |
|
00 |
|
00 |
|
00 |
|
|
56 |
exe文件的結束標誌 |
|
34 |
|
12 |
|
FA |
|
|
記錄swf文件大小的四個字節 |
與5C004~5C007的內容相同 |
|
|
|
到這裏我們對swf文件的解剖分析就結束了,你可以結合着Flash控件動手製作一個你自己的flash播放器,一定會很棒!
|