FLASH 生成的SWF是用Zlib压缩的。从文件开头的第9个字节后开始解压的。
这里我为了测试压缩,已经把从第9个字节后的内容单独保存为一个文件了。不过当我在解压后,写入新文件的时候出错,找了半天找不到原因。请大家帮帮我。
谢谢。先有一个解压函数:procedure UnCompressSWF(const CompressedStream: TFileStream);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
Buffer: PChar;
Count: Integer;
begin
CompressedStream.ReadBuffer(Count, SizeOf(Count));
Count := CompressedStream.Size;
GetMem(Buffer, Count);
DestStream := TMemoryStream.Create;
CompressedStream.Position := 0;
SourceStream := TDecompressionStream.Create(CompressedStream);
Try
SourceStream.ReadBuffer(Buffer^, Count);
DestStream.WriteBuffer(Buffer^, Count); /////// 这里出错///////
DestStream.Position := 0;
DestStream.SaveToFile('c:\ok.swf');
finally
FreeMem(Buffer);
DestStream.Free;
SourceStream.Free;
end;
end;
按纽事件:procedure TForm1.Button4Click(Sender: TObject);
var
CompressedStream: TFileStream;
begin
CompressedStream := TFileStream.Create(swfFilename.text,fmOpenRead);
try
UnCompressSWF(CompressedStream);
finally
CompressedStream.Free;
end;
end;谢谢大家了。
这里我为了测试压缩,已经把从第9个字节后的内容单独保存为一个文件了。不过当我在解压后,写入新文件的时候出错,找了半天找不到原因。请大家帮帮我。
谢谢。先有一个解压函数:procedure UnCompressSWF(const CompressedStream: TFileStream);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
Buffer: PChar;
Count: Integer;
begin
CompressedStream.ReadBuffer(Count, SizeOf(Count));
Count := CompressedStream.Size;
GetMem(Buffer, Count);
DestStream := TMemoryStream.Create;
CompressedStream.Position := 0;
SourceStream := TDecompressionStream.Create(CompressedStream);
Try
SourceStream.ReadBuffer(Buffer^, Count);
DestStream.WriteBuffer(Buffer^, Count); /////// 这里出错///////
DestStream.Position := 0;
DestStream.SaveToFile('c:\ok.swf');
finally
FreeMem(Buffer);
DestStream.Free;
SourceStream.Free;
end;
end;
按纽事件:procedure TForm1.Button4Click(Sender: TObject);
var
CompressedStream: TFileStream;
begin
CompressedStream := TFileStream.Create(swfFilename.text,fmOpenRead);
try
UnCompressSWF(CompressedStream);
finally
CompressedStream.Free;
end;
end;谢谢大家了。
刚才测试的时候看了下大小。忘记删除了。
谢谢。
CompressedStream.Position := 0;
应该是
CompressedStream.Position := 4;
-》
CompressedStream.Position := 4;SourceStream.ReadBuffer(Buffer^, Count);
DestStream.WriteBuffer(Buffer^, Count);
->
SourceStream.ReadBuffer(Buffer, Count);
DestStream.WriteBuffer(Buffer, Count);