2009-10-16 30 views
0

我想使用Alex Beregszaszi編寫的cws2fws工具將壓縮的swf文件轉換爲未壓縮的swf文件,該工具是轉換例程的ffmpeg集合的一部分。我使用的壓縮文件是有效的文件,因爲它們可以通過Firefox和其他程序打開和播放,但是當我通過cws2fws運行它們時,程序會給出錯誤(-5),指示文件已損壞。我已下載該程序的源代碼並使用Visual Studio進行編譯。當我通過新編譯的程序運行我的文件時,我得到的結果與從Web下載的程序相同。在調試程序時,我注意到用於確定swf的未壓縮文件大小的四個字節中的兩個是負數(參見下面的第64行)。使用cws2fws轉換壓縮的swf的問題

00056  if (buf_in[0] != 'C' || buf_in[1] != 'W' || buf_in[2] != 'S') 
00057  { 
00058   printf("Not a compressed flash file\n"); 
00059   exit(1); 
00060  } 
00061 
00062  fstat(fd_in, &statbuf); 
00063  comp_len = statbuf.st_size; 
00064  uncomp_len = buf_in[4] | (buf_in[5] << 8) | (buf_in[6] << 16) | (buf_in[7] << 24); 
00065 
00066  printf("Compressed size: %d Uncompressed size: %d\n", comp_len-4, uncomp_len-4); 

所以,我的問題是:

1)我感覺有點密集,所以可能有人請解釋確定從4個字節的文件大小的邏輯如圖線路64我明白該大小可能是2至2^32的一系列冪的增加,但是如何使用位運算符來獲取正確的數字?

2)buf_in [5]和buf_in [6]都是負數,這可能是操作系統之間的問題,因爲我在Windows機器上,而且這個代碼顯然是在* nix機器上開發的。對我來說,這表示程序中的一個錯誤,它與已簽名和未簽名的整數有關。我是否正確,我該如何繼續?

3)這段代碼可能無法處理較新的swf文件嗎?

4)有沒有人最近使用過這個程序成功了?

感謝您提前幫忙。

回答

2

buf_in是什麼類型的?如果它是char *,請將其更改爲unsigned char *char的簽名因平臺,編譯器和選項而異,此處使用明顯無符號算術。它在buf_in的偏移量3處取4個字節並將它們讀爲小端32位整數。

這就是說,我寫了一個愚蠢的小SWF解壓縮器在以前。

#!/usr/bin/perl 
use Compress::Zlib; 
undef $/; 
binmode(ARGV); 
while (<>) { 
    my ($a, $b, $c) = unpack 'a3a5a*' => $_; 
    if ($a eq 'CWS') { 
     open FH, '>:raw', "${ARGV}.raw"; 
     syswrite FH, "FWS$b"; 
     syswrite FH, uncompress($c); 
    } 
} 

應該適用於任何合理的Perl安裝。

+0

Err,s/offset 3/offset 4 /當然。 – ephemient 2009-10-16 16:01:13

0

我剛剛發現由王璐更新的Alex的另一個版本代碼。盧找到了同樣的錯誤。該代碼位於:http://theliel.papipapito.com/Doc/Code/CWS2FWS.c

請注意,盧在他的修訂中引入了一個錯誤。該行:

if (buf_in[0] != 'F' || buf_in[1] != 'W' || buf_in[2] != 'S') 
    { 
    printf("Not a compressed flash file\n"); 
    exit(1); 
    } 

測試一個未壓縮的SWF文件,當它測試一個壓縮文件時。片段應該是:

if (buf_in[0] != 'C' || buf_in[1] != 'W' || buf_in[2] != 'S') 
    { 
    printf("Not a compressed flash file\n"); 
    exit(1); 
    } 
+0

對於問題1,我仍然感覺很密集)。任何接受者? – jay 2009-10-16 14:09:26