SWF文件結構大解剖

SWF文件結構大解剖

   
 
  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播放器,一定會很棒!



 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章