{ Тестирование алгоритма Лемпеля-Зива Упаковка файла. } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2001 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 75-47-15 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 2001 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} program LZFileTest; USES PrgFuncs, xStrings, uMiscFun, LZTypes, LZFile, FCmdLine; procedure Compress( var Compressor:tLZFile; Count:word; FileName1,FileName2:string); var sz1,sz2:longint; t0:tTimerTiks; dt:tTimerDecimalTiks; i:word; begin write(' Упаковка: "',FileName1,'" -> "',FileName2,'" (повтор, раз: ',Count,')...'); Compressor.FlagSet(fOverwriteCompressed); if Count<=0 then Count:=1; t0:=WaitNextTickCount; for i:=1 to Count do begin Compressor.EncodeFile(FileName1,FileName2); end; GetTickSpent(t0,Count,dt); writeln(' завершено.'); if ORD(Compressor.LastError)=0 then begin write(' Время на 1 упаковку, мс: ',dt.mSec,'.',dt.mAfterDotSec,';'); sz1:=SizeOfFile(FileName2); sz2:=SizeOfFile(FileName1); writeln(' Скорость, байт/с: ',GetBytesPerSeconds(sz2, dt),'.'); writeln(' Отношение (Размер упакованного файла)/(Размер исходного): ', (sz1/sz2):2:4); writeln(' Степень сжатия данных (упакованные)/(исходные): ', Compressor.CompressionRatio:2:4); writeln(' Сбросов словаря: ',Compressor.DictionaryResetCount, '. Макс. длина фрагмента: ',Compressor.FragmentLength); end else writeln(^G' ОШИБКА: ',ORD(Compressor.LastError)); end; procedure Decompress( var Compressor:tLZFile; Count:word; FileName1,FileName2:string); var t0:longint; dt:tTimerDecimalTiks; i:word; sz:longint; begin write(' Распаковка: "',FileName1,'" -> "',FileName2,'" (повтор, раз: ',Count,')...'); Compressor.FlagSet(fOverwriteUncompressed); if Count<=0 then Count:=1; t0:=WaitNextTickCount; for i:=1 to Count do begin Compressor.DecodeFile(FileName1,FileName2); end; GetTickSpent(t0,Count,dt); writeln(' завершено.'); if ORD(Compressor.LastError)=0 then begin sz:=SizeOfFile(FileName2); write(' Время на 1 распаковку, мс: ',dt.mSec,'.',dt.mAfterDotSec,';'); writeln(' Скорость, байт/с: ',GetBytesPerSeconds(sz, dt),'.'); end else writeln(^G' ОШИБКА: ',ORD(Compressor.LastError)); end; var Compressor:tLZFile; ProgParams:tProgramParameters; BEGIN writeln; write('Программа LZFileTest запущена '); {$IfDef MsDOS} write('(real mode)'); {$Else} write('(protected mode)'); {$EndIF} writeln('...'); FCmdLine.ParseCmdLine(ProgParams); if ProgParams.Action=aHelp then begin FCmdLine.ShowHelp; end else begin Compressor.Init(ProgParams.BufLength, ProgParams.DicSize, ProgParams.FragmentLength); writeln( ' Размер словаря, симв.: ',Compressor.SizeInNodes, '. Макс. длина фрагмента, симв.: ',Compressor.MaxFragmentLength ); if ProgParams.Action in [aCompress, aCompressAndDecompress] then begin Compress(Compressor, ProgParams.iMax, ProgParams.FNameIn, ProgParams.FNameOut1); end; if ProgParams.Action in [aDecompress] then begin Decompress(Compressor, ProgParams.iMax, ProgParams.FNameIn, ProgParams.FNameOut2); end; if ProgParams.Action in [aCompressAndDecompress] then begin Decompress(Compressor, ProgParams.iMax, ProgParams.FNameOut1, ProgParams.FNameOut2); if CompareFiles(ProgParams.FNameIn,ProgParams.FNameOut2,cBufLength) then writeln(' Правильно.') else begin writeln(' НЕправильно.'^G^G^G); end; end; end; writeln('программа LZFileTest завершена.'); END.