{ Тестирование алгоритма Хаффмана Упаковка файла с оптимизацией размера буфера. } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2000 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 75-47-15 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 1999 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} program HuffmanOptFileTest; USES PrgFuncs, xStrings, uMiscFun, HuffBase, HuffmanF, FCmdLine, HufTypes; procedure Compress( var Huffman:tHuffman; Count:word; Fl1,Fl2:string); var sz1,sz2:longint; t0:tTimerTiks; dt:tTimerDecimalTiks; i:word; begin write(' Упаковка: "',Fl1,'" -> "',Fl2,'" (повтор, раз: ',Count,')...'); Huffman.FlagSet(fOverwriteCompressed); if Count<=0 then Count:=1; t0:=WaitNextTickCount; for i:=1 to Count do begin Huffman.EncodeFileOptimal(Fl1,Fl2); end; GetTickSpent(t0,Count,dt); writeln(' завершено.'); if ORD(Huffman.LastError)=0 then begin writeln(' Время на 1 упаковку, мс: ',dt.mSec,'.',dt.mAfterDotSec); sz1:=SizeOfFile(Fl2); sz2:=SizeOfFile(Fl1); writeln(' Отношение (Размер упакованного файла)/(Размер исходного): ',(sz1/sz2):2:4); end else writeln(^G' ОШИБКА: ',ORD(Huffman.LastError)); end; procedure Decompress( var Huffman:tHuffman; Count:word; Fl1,Fl2:string); var t0:longint; dt:tTimerDecimalTiks; i:word; begin write(' Распаковка: "',Fl1,'" -> "',Fl2,'" (повтор, раз: ',Count,')...'); Huffman.FlagSet(fOverwriteUncompressed); if Count<=0 then Count:=1; t0:=WaitNextTickCount; for i:=1 to Count do begin Huffman.DecodeFile(Fl1,Fl2); end; GetTickSpent(t0,Count,dt); writeln(' завершено.'); if ORD(Huffman.LastError)=0 then writeln(' Время на 1 распаковку, мс: ',dt.mSec,'.',dt.mAfterDotSec) else writeln(^G' ОШИБКА: ',ORD(Huffman.LastError)); end; var Huffman:tHuffman; ProgParams:tProgramParameters; BEGIN writeln; write('Программа HuffmanFileTest(WithOptimalBufSize) запущена '); {$IfDef MsDOS} write('(real mode)'); {$Else} write('(protected mode)'); {$EndIF} writeln('...'); { HuffBase.ProcTypeSet(pEncode, ptSimple);} { HuffBase.ProcTypeSet(pDecode, ptAdvanced);} FCmdLine.ParseCmdLine(ProgParams); if ProgParams.Action=aHelp then begin FCmdLine.ShowHelp; end else begin Huffman.Init(ProgParams.BufLength); Huffman.OptimalSizeMinSet(ProgParams.BufLength div 4); Huffman.OptimalSizeStepSet(ProgParams.BufLength div 5); if ProgParams.Action in [aCompress, aCompressAndDecompress] then begin Compress(Huffman, ProgParams.iMax, ProgParams.FNameIn, ProgParams.FNameOut1); end; if ProgParams.Action in [aDecompress] then begin Decompress(Huffman, ProgParams.iMax, ProgParams.FNameIn, ProgParams.FNameOut1); end; if ProgParams.Action in [aCompressAndDecompress] then begin Decompress(Huffman, ProgParams.iMax, ProgParams.FNameOut1, ProgParams.FNameOut2); if CompareFiles(ProgParams.FNameIn,ProgParams.FNameOut2,cBufLength) then writeln(' Правильно.') else writeln(' НЕправильно.'); end; end; writeln('программа HuffmanFileTest завершена.'); END.