unit untZX;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, StdCtrls, ZLib;

type
  TfrmZX = class(TForm)
    mmo1: TMemo;
    StatusBar1: TStatusBar;
    mm1: TMainMenu;
    F1: TMenuItem;
    O1: TMenuItem;
    S1: TMenuItem;
    A1: TMenuItem;
    dlgOpen1: TOpenDialog;
    dlgSave1: TSaveDialog;
    procedure O1Click(Sender: TObject);
    procedure S1Click(Sender: TObject);
    procedure A1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmZX: TfrmZX;

implementation

{$R *.dfm}

function Swap32(const Value: LongWord): LongWord;
begin
  Result := Swap(Word(Value)) shl 16 + Swap(Word(Value shr 16));
end;

function UnZipCofing(Fname: string): string;
var
  ds: TDecompressionStream;
  ms, fs, tmpfs: TMemoryStream;
  ss: TStringStream;
  bufferSize, blockSize, nextOff: LongWord;
begin
  fs := TMemoryStream.Create;
  tmpfs := TMemoryStream.Create;
  ms := TMemoryStream.Create;
  ss := TStringStream.Create('');
  if not FileExists(Fname) then
  begin
    ShowMessage('文件不存在！');
    exit;
  end;
  try
    fs.LoadFromFile(Fname);
    nextOff := 60;
    while nextOff > 0 do
    begin
      fs.Seek(nextOff, soFromBeginning);
  //读取缓冲区大小
      fs.Read(bufferSize, SizeOf(bufferSize));
      bufferSize := Swap32(bufferSize);
  //读取压缩块大小
      fs.Read(blockSize, SizeOf(blockSize));
      blockSize := Swap32(blockSize);
  //读取下一块位置
      fs.Read(nextOff, SizeOf(nextOff));
      nextOff := Swap32(nextOff);
      //复制压缩数据块到临时数据流
      tmpfs.Clear;
      tmpfs.CopyFrom(fs, blockSize);
      tmpfs.Position := 0;
      //解压数据块
      ds := TDecompressionStream.Create(tmpfs);
      ms.SetSize(bufferSize);
      ZeroMemory(ms.Memory, bufferSize);
      ms.Position := 0;
      ds.Read(ms.Memory^, bufferSize);
      //将解压后的数据流复制到字符串数据流
      ss.CopyFrom(ms, 0);
      ds.Free;
    end;{end while}
    //输出合并后的字符串流。
    Result := ss.DataString;
  finally
    //垃圾回收
    fs.Free;
    tmpfs.Free;
    ms.Free;
    //ds.Free;
    ss.Free;
  end;
end;

procedure TfrmZX.O1Click(Sender: TObject);
begin
  if dlgOpen1.Execute then
  begin
    mmo1.Text :=StringReplace(UnZipCofing(dlgOpen1.FileName),#10,#13#10,[rfReplaceAll]);
  end;
end;

procedure TfrmZX.S1Click(Sender: TObject);
begin
  if dlgSave1.Execute then
  begin
     mmo1.Lines.SaveToFile(dlgSave1.FileName); 
  end;
end;

procedure TfrmZX.A1Click(Sender: TObject);
begin
  MessageBox(Handle, '中兴配置文件解密工具' + #13#10#13#10 +
    '作者：yulinsoft', '关于', MB_OK + MB_ICONINFORMATION);

end;

end.

