使用 cws2fws 转换压缩 swf 的问题

Posted

技术标签:

【中文标题】使用 cws2fws 转换压缩 swf 的问题【英文标题】:Problem with converting compressed swf with cws2fws 【发布时间】:2009-10-16 11:50:58 【问题描述】:

我正在尝试使用 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] 都是负数,这可能是操作系统之间的问题,因为我在 Windows 机器上,而这段代码显然是在 *nix 机器上开发的。对我来说,这表明程序中存在与有符号和无符号整数有关的错误。我是否正确?我该如何继续?

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

4) 最近有没有人成功使用过这个程序?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

buf_in 的类型是什么?如果是char *,则将其更改为unsigned char *char 的符号因平台、编译器和选项而异,这里显然是无符号算术。它在buf_in 的偏移量 3 处占用 4 个字节,并将它们作为 little-endian 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 安装。

【讨论】:

【参考方案2】:

我刚刚找到了由王璐更新的另一个版本的 Alex 的代码。 Lu 发现了与我发现的相同的错误。代码位于: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 文件。 sn-p 应该是:

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

【讨论】:

我仍然对问题 1) 感到紧张。有接受者吗?

以上是关于使用 cws2fws 转换压缩 swf 的问题的主要内容,如果未能解决你的问题,请参考以下文章

把Sratch作品转为swf文件

gif jpg rar txt zip swf jqf 分别是啥意思呢

Flash对象 - 拉伸和压缩宽高比

linux下如何看swf文件

iOS快捷转音视频格式,有它就够了

使用 AVX512 将压缩 64 位整数转换为带符号饱和的压缩 8 位整数