Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 20:44   #1
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
Вопрос Алгоритм Хаффмана

Тут такой вопрос! Как с помощью алгоритма Хаффмана(или по методу LZW) архивировать не один файл, а целую группу файлов?

Последний раз редактировалось [BeNdeR]; 20.02.2012 в 21:02.
[BeNdeR] вне форума Ответить с цитированием
Старый 20.02.2012, 21:12   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

И в чём проблема? Первым проходом открывай по очереди файлы, да считай частоту вхождения символов в этих файлах. Вторым проходом кодируй файлы согласно твоему алфавиту. Алфавит сохрани отдельным файлом, чтобы потом разархивировать.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 20.02.2012, 22:12   #3
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Цитата:
да считай частоту вхождения символов в этих файлах
а можно вот про это по подробнее?)
[BeNdeR] вне форума Ответить с цитированием
Старый 20.02.2012, 22:28   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Боже ж ты мой. Вот ТУТ словестное описание алгоритма, а внизу страницы реализация алгоритма кодирования по Хаффману на паскале. Въезжай в код. Выкладывай непонятные места.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 20.02.2012 в 22:32.
Rin вне форума Ответить с цитированием
Старый 20.02.2012, 22:34   #5
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
Боже ж ты мой. Вот ТУТ словестное описание алгоритма, а внизу страницы реализация алгоритма кодирования по Хаффману на паскале. Въезжай в код. Выкладывай непонятные места.
Ооооо! Спасиб! Сейчас гляну!)
[BeNdeR] вне форума Ответить с цитированием
Старый 26.02.2012, 23:34   #6
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Что-то это как-то трудновато) Не могли бы вы мне это показать кодом?
[BeNdeR] вне форума Ответить с цитированием
Старый 26.02.2012, 23:50   #7
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

И ещё такой вопрос как на созданный архив пароль наложить? Нужно по нажатию кнопки "архивировать" записать его в файл с какой-то меткой, а при нажатии "разархивировать" считать до конца файла, найти метку и сравнить введённые пароли? (очень грубо описал, под меткой я понимаю просто слово) Но я думаю, что это плохой метод!)
[BeNdeR] вне форума Ответить с цитированием
Старый 28.02.2012, 21:18   #8
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Код:
procedure SaveInfo;
Var I : byte;
    S : string;
    R : TSearchRec;
begin
 S:=ExtractFileName(Form1.OpenDialog1.FileName);
 OutBuf[0]:=length(s);
 Inc(OutCounter);
 For I:=1 to Length(S)+1 do
  begin
   OutBuf[OutCounter]:=byte(Ord(S[I]));
   Inc(OutCounter);
  end;
 FindFirst(S,$00,R);
 Dec(OutCounter);
 Move(R.Time,OutBuf[OutCounter],4);
 OutCounter:=OutCounter+4;
 OutBuf[OutCounter]:=R.Attr;
 Move(R.Size,OutBuf[OutCounter+1],4);
 OutCounter:=OutCounter+5;
end;


procedure SaveTable;
Var I : byte;
begin
 For I:=0 to 255 do
  begin
   OutBuf[OutCounter]:=Hi(Table[I]^.Count);
   Inc(OutCounter);
   OutBuf[OutCounter]:=Lo(Table[I]^.Count);
   Inc(OutCounter);
  end;
end;


procedure CreateCodeArchiv;
begin
 CreateTable;   
 FindVer;       
 SortQueueByte; 
 SaveInfo;      
 SaveTable;     
 CreateTree;         
 CreateCompressCode;


procedure PakOneByte;
Var Mask : word;
    Tail : boolean;
begin
 CRC:=CRC XOR InBuf[InCounter];
 Mask:=Table[InBuf[InCounter]]^.Bites SHR CounterBite;
 OutWord:=OutWord OR Mask;
 CounterBite:=CounterBite+Table[InBuf[InCounter]]^.BitLen;
 If CounterBite>15 then Tail:=True else Tail:=False;
 While CounterBite>7 do
  begin
   OutBuf[OutCounter]:=Hi(OutWord);
   Inc(OutCounter);
   If OutCounter=(SizeOf(OutBuf)-4) then
    begin
     BlockWrite(OutputF,OutBuf,OutCounter,NumWritten);
     OutCounter:=0;
    end;
   CounterBite:=CounterBite-8;
   If CounterBite<>0 then OutWord:=OutWord SHL 8 else OutWord:=0;
  end;
 If Tail then
  begin
   Mask:=Table[InBuf[InCounter]]^.Bites SHL
   (Table[InBuf[InCounter]]^.BitLen-CounterBite);
   OutWord:=OutWord OR Mask;
  end;
 Inc(InCounter);
 If (InCounter=(SizeOf(InBuf))) or (InCounter=NumRead) then
  begin
   InCounter:=0;
   BlockRead(InputF,InBuf,SizeOf(InBuf),NumRead);
  end;
end;


procedure PakFile;
begin
S:=Form1.SaveDialog1.filename;
Assignfile(OutputF, S);
Rewrite(OutputF, 1);
Assignfile(InputF, Form1.OpenDialog1.FileName);
Reset(InputF,1);
//application.MessageBox(PChar('Èìÿ ôàéëà:  '+ExtractFileName(Form1.OpenDialog1.FileName)),pchar('Óïàêîâêà ôàéëà'),MB_ICONINFORMATION);
//application.MessageBox(PChar('Ñîçäàíèå àðõèâà '+S),pchar('Óïàêîâêà ôàéëà'),MB_ICONINFORMATION);
BlockRead(InputF,InBuf,SizeOf(InBuf),NumRead);
OutWord:=0;
CounterBite:=0;
OutCounter:=0;
InCounter:=0;
CRC:=0;
CreateCodeArchiv;
While (NumRead<>0) do PakOneByte;
OutBuf[OutCounter]:=Hi(OutWord);
Inc(OutCounter);
OutBuf[OutCounter]:=CRC;
Inc(OutCounter);
BlockWrite(OutputF,OutBuf,OutCounter,NumWritten);
FreeTable;
Closefile(InputF);
Closefile(OutputF);
end;
Если, к примеру, вот так я буду архивировать один файл! Не очень понимаю куда цикл запихнуть! И так понимаю, что в начале каждого файла внутри архива нужно записывать имя файла, чтобы потом его разаривировать можно было!
[BeNdeR] вне форума Ответить с цитированием
Старый 29.02.2012, 04:45   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

[BeNdeR], если Ты хочешь, чтобы тебе помогли, то код надо комментировать, чтобы в нем разбираться было удобно. Комментарии в заголовке процедур -что она делает , и наиболее важные участки кода. Если Ты его копировал откуда-то, но не понял КАК ЭТО РАБОТАЕТ, то САМ пройдись трассировкой по коду.
Сам не практиковал шифрование, поэтому помочь тебе особо не смогу, если не объяснишь код.
Пойми, что разбираться в чужом коде - это морока, и если не откомментируешь код, то скорей всего никто не поможет.
Цитата:
И ещё такой вопрос как на созданный архив пароль наложить? Нужно по нажатию кнопки "архивировать" записать его в файл с какой-то меткой, а при нажатии "разархивировать" считать до конца файла, найти метку и сравнить введённые пароли? (очень грубо описал, под меткой я понимаю просто слово) Но я думаю, что это плохой метод!)
Поищи реализацию алгоритма в RAR. По известным мне данным, но не исключая Закон Старджона, rar ломать себе дороже. Будешь хорошо искать, узнаешь, как защитить свои файлы.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 29.02.2012 в 05:13.
Rin вне форума Ответить с цитированием
Старый 29.02.2012, 16:54   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а я лично не понимаю, какое отношение алгоритм сжатия данных имеет к топику "Мультимедия в Delphi"
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Хаффмана. Декодирование. Bal_Bes Помощь студентам 0 08.06.2011 21:04
алгоритм хаффмана. chuvakner Помощь студентам 4 30.10.2010 23:33
Алгоритм Хаффмана 0479 Помощь студентам 1 15.09.2010 11:53
Алгоритм Хаффмана. Vetal115 Общие вопросы по Java, Java SE, Kotlin 0 22.04.2010 22:23