使用cws2fws转换压缩swf的问题

时间:2009-10-16 11:50:59

标签: c flash

我正在尝试使用Alex Beregszaszi编写的cws2fws实用程序将压缩的swf文件转换为未压缩的swf文件,这是ffmpeg转换例程集的一部分。我使用的压缩文件是有效文件,因为它们可以由Firefox和其他程序打开和播放,但是当我通过cws2fws运行它们时,程序会给出错误(-5),表明文件已损坏。我已下载该程序的源代码并使用Visual Studio编译它。当我通过新编译的程序运行我的文件时,我得到的结果与我从网上下载的程序相同。在调试程序时,我注意到用于确定swf的未压缩文件大小的四个字节中的两个是负数(参见下面的第64行)。

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]都是否定的,这可能是OS之间的问题,因为我在Windows机器上,而且这个代码显然是在* nix机器上开发的。对我来说,这表明程序中的一个错误与有符号和无符号整数有关。我是否正确,我该如何处理?

3)此代码是否可能无法处理较新的swf文件?

4)最近有人使用过该计划吗?

先谢谢你的帮助。

2 个答案:

答案 0 :(得分: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安装上工作。

答案 1 :(得分:0)

我刚刚发现王璐更新的另一个版本的Alex代码。卢发现了我发现的同样的错误。代码位于:http://theliel.papipapito.com/Doc/Code/CWS2FWS.c

请注意,Lu在他的修订中引入了一个错误。这一行:

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);
     }
相关问题