CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

请问实现SWF文件格式与EXE文件格式的相互转换?

楼主yingshang(伤影)2002-11-12 21:17:36 在 Delphi / VCL组件开发及应用 提问

请问实现SWF文件格式与EXE文件格式的相互转换? 问题点数:100、回复次数:2Top

1 楼vstart()回复于 2002-11-12 21:21:03 得分 0

嘿嘿,装上Flash,在目录里找那个Flash播放器,打开你要转换的Swf格式文件另存为exe文件就万事OK了……Top

2 楼tianherang(tian)回复于 2002-11-12 23:54:33 得分 100

网上找的:  
  随着Macromedia   Flash   5的闪亮推出,Flash在网络多媒体应用方面已经占据了不可动摇的地位,再加上中国闪客们的无私劳动,许多经典歌曲,比如“东北人”、“第一次”   等等都有了Flash版本的MTV,真是别有一番情趣。然而,网络上许多Flash作品都是EXE形式的,虽然方便了没有安装Flash插件的朋友,但是EXE形式的Flash不能用于网页制作,更不用说分析Action什么的了。由于手边没有免费的EXE2SWF工具,于是决定自己DIY一个,一显Programmer本色!    
   
  一、开发工具    
   
  我用到的开发工具有Delphi6,最好用的RAD工具;   UltraEdit,强大的16进制编辑工具;ShowGood三国系列中的财神到.swf、桃源结义.swf、神啊救救我吧.exe、割须弃袍.exe;最后就是思考,最有力也是最根本的工具。^_^    
   
  二、基本思路    
   
  首先我设想了一个基本思路:EXE形式的Flash包含两部分,Flash播放器和跟在播放器后面的Swf文件,因为BMP2EXE、MP32EXE等软件都是这么做的。是不是这样呢?我们动手看一看吧!    
   
  用UltraEdit打开“财神到.swf”和“桃源结义.swf”分析文件头,非常明显,文件头都包括相同的ASCII码“FWS”,估计这是Flash文件的标识符。用UltraEdit打开“神啊救救我吧.exe”,文件全长1183046字节。按下Ctrl+F调出搜索对话框,在Find   What后填入“FWS”并且勾上“Find   ASCII”,搜索。果不其然,在5c000处找到了“FWS”,接着的部分也和“财神到.swf”中的非常相似,可见假设很有可能是正确的。顺藤摸瓜,查看两个.swf文件的文件尾,都是若干个00加上40   00   00   00的形式,然而“神啊救救我吧.exe”的文件尾却是若干个00加上40   00   00   00再加上120d3e处的56   34   12   FA   3E   4D   0C   00。最后这八个字节会是什么呢?再打开“割须弃袍.exe”,发觉它的最后八个字节是56   34   12   FA   82   F5   12   00。聪明的你一定猜到56   34   12   FA是EXE形式Flash文件的标识符了吧?经过检查其他EXE形式的Flash,事实证明了这个猜测是正确的。至于3E   4D   0C   00是什么呢?不妨把它当作一个32位整数,注意到低字节和高字节的逆序,3E   4D   0C   00就应该等于00   0C   4D   3E,也就是十进制的806206。OK!至此我们已经获取了足够多的信息,接着就看看有什么巧合吧!颠来倒去,不难发现,把“神啊救救我吧.exe”中swf部分的结束地址120d3e减去起始地址5c000,不就正好得到806206?    
  接下来要办的事情就简单了,我们动手证实一下。还是利用UltraEdit,把5c000至120d3e之间的数据粘贴出来,保存为一个.swf文件,用IE打开一看,这不就是久违了的陈小春的歌吗(如图1)?呵呵,大功告成!    
   
   
   
   
   
   
  顺便说一句,如果好奇的话,你还可以把0至5c000的数据直接保存成.exe文件看看,呵呵,惊奇吧,就是Flash   5中的Standalone   Player!    
   
   
   
   
   
  三、编写程序    
   
  在正式编写程序之前,我想先花一些时间介绍Delphi   中的文件流操作。如果你已经对这个非常熟悉了,可以跳过去,直接阅读后文的代码。否则,请花一点时间看一看,这对于你阅读下面的代码非常有帮助。    
   
  在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。那什么是流呢?简单来说,流就是建立在面向对象基础上的一种抽象的处理数据的工具。流中定义了一些处理数据的基本操作,如读取数据、写入数据等,程序员只是面对流进行所有操作的,不用关心流的另一头数据的真正流向。我们程序中将要使用TFileStream,它是TStream最常用的派生类。使用   TFileStream操作文件要比Object   Pascal基本文件操作方便得多。TFileStream的基本操作是这样的:首先create一个实例,然后用try...finally   TFileStream.free的格式操作,“...”部分可以用TFileStream的ReadBuffer、   Seek、    
   
  WriteBuffer、CopyFrom方法来操作文件流。此外,流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。编写程序时善加利用流,将会大大提高编程的效率。    
   
  好了,现在让我们正式开工。首先我们先设计窗体。打开Delphi,首先在窗体上添加两个Button、两个Edit、一个OpenDialog以及若干个Label工具,界面设计以及控件   Name属性都请参考图3,其他的采用默认值。    
   
   
   
   
  btnOpen是用来打开硬盘上EXE形式的Flash文件的,双击之,添加如下的代码:    
   
  procedure   TForm1.btnOpenClick(Sender:   TObject);    
   
  begin    
   
  //   通过OpenDialog让用户选择EXE形式的Flash    
   
  if   OpenDialog.Execute   then    
   
  begin    
   
  edtSourceExe.Text   :=   OpenDialog.FileName;    
   
  //   自动生成.swf格式的文件名,方便用户    
   
  edtTargetSwf.Text   :=   ChangeFileExt(edtSourceExe.Text,   '.swf');    
   
  end;    
   
  end;    
   
  btnConvert是用来转换文件格式的按钮,双击之,添加如下代码:    
   
  procedure   TForm1.btnConvertClick(Sender:   TObject);    
   
  var    
   
  //   分别处理EXE、SWF文件的文件流    
   
  SourceStream,   DestinyStream:   TFileStream;    
   
  //   SWF文件的大小    
   
  SwfFileSize:   Cardinal;    
   
  begin    
   
  //   打开EXE形式的源文件    
   
  SourceStream   :=   TFileStream.Create(edtSourceExe.Text,   fmOpenRead   or   fmShareExclusive);    
   
  try    
   
  //   读取文件标志    
   
  SourceStream.Seek(-   2   *   sizeof(integer),   soFromEnd);    
   
  SourceStream.ReadBuffer(SwfFileSize,   sizeof(integer));    
   
  //   判断读到的文件标志是否和FA123456相同    
   
  //   借此判断是否是Macromedia官方格式的Flash文件    
   
  if   SwfFileSize   =   $FA123456   then    
   
  begin    
   
  //   读取SWF文件的大小    
   
  SourceStream.ReadBuffer(SwfFileSize,   sizeof(SwfFileSize));    
   
  SourceStream.Seek(-   SwfFileSize   -   2   *   sizeof(integer),   soFromEnd);    
   
  //   打开目标SWF文件    
   
  DestinyStream   :=   TFileStream.Create(edtTargetSwf.Text,   fmCreate);    
   
  try    
   
  //   从EXE文件流中读取数据    
   
  DestinyStream.CopyFrom(SourceStream,   SwfFileSize);    
   
  ShowMessage('File   has   been   converted   successfully!');    
   
  finally    
   
  //   OK,释放文件流    
   
  DestinyStream.Free;    
   
  end;    
   
  end    
   
  else    
  ShowMessage('Unknown   type   of   executable   flash   file!');    
   
  finally    
   
  //   OK,释放文件流    
   
  SourceStream.Free;    
   
  end;    
   
  end;    
   
  程序比较简单,参考代码中的注释,相信程序很好理解。现在按下F9运行,打开一个EXE形式的Flash文件,按下Convert键,相应的SWF形式的Flash便生成了,我们的目的也就达到了。原理分析清楚了,再做一个SWF2EXE也是很简单的事情,只需要在文件头部依次追加Macromedia   Flash   5中的Standalone   Player、SWF文件、FA123456标志以及SWF文件长度即可。下面给出简单的示例代码,仅供参考:    
   
  function   Swf2Exe(Source,   Destiny,   Linker:   string):   string;    
   
  var    
   
  //   Source、Destiny、Linker分别是swf、exe和Standalone   Player的文件名    
   
  SourceStream,   DestinyStream,   LinkStream:   TFileStream;    
   
  flag:   Cardinal;    
   
  SwfFileSize:   integer;    
   
  begin    
   
  result   :=   'something   error';    
   
  //   建立EXE文件    
   
  DestinyStream   :=   TFileStream.Create(Destiny,   fmCreate);    
   
  try    
   
  //   追加Standalone   Player    
   
  LinkStream   :=   TFileStream.Create(Linker,   fmOpenRead   or   fmShareExclusive);    
   
  try    
   
  DestinyStream.CopyFrom(LinkStream,   0);    
   
  finally    
   
  LinkStream.Free;    
   
  end;    
   
  //   追加SWF文件    
   
  SourceStream   :=   TFileStream.Create(Source,   fmOpenRead   or   fmShareExclusive);    
   
  try    
   
  DestinyStream.CopyFrom(SourceStream,   0);    
   
  //   追加FA123456标志    
   
  flag   :=   $FA123456;    
   
  DestinyStream.WriteBuffer(flag,   sizeof(integer));    
   
  //   追加SWF文件长度    
   
  SwfFileSize   :=   SourceStream.Size;    
   
  DestinyStream.WriteBuffer(SwfFileSize,   sizeof(integer));    
   
  result   :=   '';    
   
  finally    
   
  SourceStream.Free;    
   
  end;    
   
  finally    
   
  DestinyStream.Free;    
   
  end;    
   
  end;    
   
  至此,SWF与EXE互相转换的程序全部完成了。程序能够正确识别Flash4以及Flash5生成的EXE形式的Flash文件。不可否认,这个程序也不是万能的,网络中仍然存在一些非Macromedia官方的EXE形式的Flash文件。如果你掌握了文件分析的本领,那么这应该也不是什么难事吧?    
   
  程序在Delphi6、Windows98/2000下调试通过。    
  Top

相关问题

  • 请问实现SWF文件格式与EXE文件格式的相互转换?
  • EXE文件格式
  • 文件格式转换
  • 找寻文件格式转换软件
  • 怎样转换RealPlayer的文件格式???
  • 转换文件格式问题
  • 关于NTFS文件格式的转换。
  • 如何转换这个文件格式?
  • 求bmp文件格式转换方法
  • 如何将具有80坐标参数的autocad文件格式转换成MapInof文件格式

关键词

  • 文件
  • flash
  • 文件格式
  • 转换
  • 数据
  • 代码
  • swf
  • destinystream
  • tfilestream
  • sourcestream

得分解答快速导航

  • 帖主:yingshang
  • tianherang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo