{ Тестирование алгоритма ДИНАМИЧЕСКИЙ метод Хаффмана Упаковка файла. } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2005 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 375-41-46 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 2005 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 375-41-46 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} program DHFileTest; USES PrgFuncs, xStrings, uMiscFun, DHFile, FCmdLine; procedure Compress( var Compressor:tDHFile; 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.TotalHalfCount:10:0); end else writeln(^G' ОШИБКА: ',ORD(Compressor.LastError)); end; procedure Decompress( var Compressor:tDHFile; 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:tDHFile; ProgParams:tProgramParameters; BEGIN writeln; write('Программа DHFileTest запущена '); {$IfDef MsDOS} write('(real mode)'); {$Else} write('(protected mode)'); {$EndIF} writeln('...'); {$IfDef LogCoding} writeln('!!! Включено журналирование'); {$EndIF} FCmdLine.ParseCmdLine(ProgParams); if ProgParams.Action=aHelp then begin FCmdLine.ShowHelp; end else begin Compressor.Init(ProgParams.BufLength); Compressor.MaxTotalCounter :=ProgParams.HalfCounterCount; Compressor.EncodeReset; writeln( ' Ополовинивание счетчиков через, симв.: ',Compressor.EffectiveMaxTotalCounter ); 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('программа DHFileTest завершена.'); END.