[论文]还原Flash MX中压缩
的SWF文件程序源代码
还原Flash MX中压缩格式的SWF文件程序源代码? Flash深入研究之四——编程还原Flash MX中压缩格式的SWF文
件
————————————————以下为程序代码—————————————
unit c2f_u1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, zlib;
type
TMain = class(TForm)
Button1: TButton;
Label3: TLabel;
Label1: TLabel;
Label2: TLabel;
OpenDialog1: TOpenDialog;
Button2: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
FileLength : LongWord; //SWF文件尺寸
FileBuf : Array of Byte; //将SWF文件读入内存存放
end;
var
Main: TMain;
implementation
{$R *.dfm}
procedure TMain.Button1Click(Sender: TObject);
var
f,fw : File;
fws : string[3]; //标示信息
version : Byte; //SWF文件版本号
CurrentPos : Integer; //内存读写位置
zStream : TDecompressionStream; //实现压缩数据还原
inStream : TMemoryStream; //压缩数据流 begin
if not OpenDialog1.Execute then exit;
FileMode:=fmOpenRead;
AssignFile(f,OpenDialog1.FileName);
Reset(f,1);
SetLength(FileBuf,FileSize(f));
BlockRead(f,FileBuf[0],Filesize(f)); //将文件读入内存
CloseFile(f);
//下面为读取SWF文件的文件头Header部分
CurrentPos:=0;
//读取'FWS'标示
SetLength(fws,3); Move(FileBuf[CurrentPos],fws[1],3);
Inc(CurrentPos,3);
if fws<>'CWS' then begin
SetLength(FileBuf,0);
ShowMessage('该文件不是Flash SWF压缩文件!');
exit;
end;
//读取版本号
Move(FileBuf[CurrentPos],version,Sizeof(version));
Inc(CurrentPos,Sizeof(version));
if Version<5 then begin
SetLength(FileBuf,0);
ShowMessage('该SWF文件不是Flash 5以上版本,本程序当前仅识别Flash 5以上格式SWF文件!');
exit;
end;
//读取SWF文件长度
Move(FileBuf[CurrentPos],FileLength,Sizeof(FileLength));
Inc(CurrentPos,Sizeof(FileLength));
//FileBuf下面的内容都是压缩数据
inStream:=TMemoryStream.Create;
//将压缩数据读入inStream压缩数据流
inStream.Write(FileBuf[CurrentPos],Length(FileBuf)-3-Sizeof
(version)-Sizeof(FileLength));
inStream.Position:=0;
//实现还原
zStream:=TDecompressionStream.Create(inStream);
//数据还原后所需缓冲区长度会加长
SetLength(FileBuf,FileLength);
//将还原的数据写回缓冲区
zStream.Read(FileBuf[3+Sizeof(version)+Sizeof(FileLength)],
FileLength-3-Sizeof(version)-Sizeof(FileLength));
zStream.Free;
inStream.Free;
fws:='FWS';
//将原CWS改为FWS
Move(fws[1],FileBuf[0],3);
//此时将缓冲区数据存盘就是SWF的还
件
ShowMessage('压缩数据已经实现还原,请存盘~');
if not SaveDialog1.Execute then exit;
AssignFile(fw,SaveDialog1.Filename);
ReWrite(fw,1);
BlockWrite(fw,FileBuf[0],Length(FileBuf));
CloseFile(fw);
SetLength(FileBuf,0);
end;
procedure TMain.Button2Click(Sender: TObject);
begin
Close; end;
end.