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;谢谢大家了。

解决方案 »

  1.   

    上面的这一行不要:Count := CompressedStream.Size;
    刚才测试的时候看了下大小。忘记删除了。
    谢谢。
      

  2.   

    我想是这一行吧,
    CompressedStream.Position := 0;
    应该是
    CompressedStream.Position := 4;
      

  3.   

    CompressedStream.Position := 0;
    -》
    CompressedStream.Position := 4;SourceStream.ReadBuffer(Buffer^, Count);
    DestStream.WriteBuffer(Buffer^, Count);
    ->
    SourceStream.ReadBuffer(Buffer, Count);
    DestStream.WriteBuffer(Buffer, Count);