Разработка программы сжатия файлов с помощью блочного кода

Автор работы: Пользователь скрыл имя, 28 Мая 2013 в 18:23, курсовая работа

Краткое описание

Цель данной курсовой работы написать с помощью Delphi программу - блочные коды постоянного смещения. Блочные коды постоянного смещения задаются начальной длиной кодового слова и величиной, на которую увеличивается длина кодового слова в каждом блоке. Сжатие происходит при выполнении следующего условия: длина кодового слова в начальном блоке - 3; смещение – 2.

Содержание

Задание 3
1 Краткое описание используемых алгоритмов и архитектуры программы
1.1 Построение таблицы кодовых слов 4
1.2 Описание алгоритмов, используемых в программе 6
1.3 Алгоритмы сжатия и восстановления файлов 7
2 Краткая инструкция пользователю по работе с программой 8
3 Результаты тестирования 10
Заключение 11
Приложение А. Код программы 12
Приложение Б. Таблица кодовых слов 18

Прикрепленные файлы: 1 файл

паишева2.doc

— 363.50 Кб (Скачать документ)

proc:=0;

 

for i:=0 to 255 do          // упорядочивание пузырьком

for j:=0 to 255-i do

if massiv[j]<massiv[j+1] then  //производим сортировку пузырьком

begin

b:=massiv[j];

massiv[j]:=massiv[j+1];

massiv[j+1]:=b;

 

b2:=indexes[j];

indexes[j]:=indexes[j+1];

indexes[j+1]:=b2;

end;

 

assignfile(filewriting,path+'.blc'); // запись в файл последовательности индексов байт

rewrite(filewriting,1); // перезаписываем данный файл

blockwrite(filewriting,indexes,256); //запись файла в массив данных

 

for i:=0 to 255 do      // сопоставление индексов кодовым словам

begin

table[i].ind:=indexes[i];

table[i].code:=Listbox1.Items.strings[i];

end;

 

for i:=0 to 255 do               // упорядочивание пузырьком записи

for j:=0 to 255-i do

if table[j].ind>table[j+1].ind then

begin

b:=table[j].ind;

table[j].ind:=table[j+1].ind;

table[j+1].ind:=b;

 

buffer:=table[j].code;

table[j].code:=table[j+1].code;

table[j+1].code:=buffer;

end;

 

stroka:='';

last:=0;

 

for s:=0 to dlina-1 do     // собираем строку

begin

stroka:=stroka+table[bytebase[s]].code;

 

while stroka<>'' do

begin

if length(stroka)>=8 then

begin

  bt:=0;

  strbuffer:=copy(stroka,1,8);

  delete(stroka,1,8);

  for j:=1 to 8 do

begin

bt:=bt shl 1;

bt:=bt or strtoint(strbuffer[j]);

end;

 blockwrite(filewriting,bt,1); // запись данных массива в файл

 end;

 

if (length(stroka)<8) and (s<>dlina-1) then

break; //выход из одного цикла

 

if ((length(stroka)<8) and (s=dlina-1) and (stroka<>'')) then

begin

while (length(stroka) mod 8 <> 0) do

begin

stroka:=stroka+'0';

last:=last+1;

end;

  bt:=0;

  strbuffer:=copy(stroka,1,8);

  delete(stroka,1,8);

 for j:=1 to 8 do //заполнение массив данными

 begin

bt:=bt shl 1;

bt:=bt or strtoint(strbuffer[j]);

end;

 blockwrite(filewriting,bt,1); запись данных массива в файл

 end;

end;

if proc<>100 then

proc:=(((s+1)*100) div dlina);  // описание прогреесс бара

ProgressBar2.Position:=proc;

end;

 

blockwrite(filewriting,last,1);

 

  closefile(filewriting); закрываем

  Showmessage('Сжатие завершено'); // выводит сообщение на экран

end;

end;

 

procedure TForm1.Button2Click(Sender: TObject); // разархивировать

var

ka,s4,le,lens:int64;

begin

if OpenDialog1.Execute then

begin

path:=OpenDialog1.FileName;    // привязка файла

 

assignfile(filereading,path); //связываем файл с файл. перемененной

reset(filereading,1); открываем файл по байтно

c:=0;                         // обнуление переменных

proc:=0;

proc2:=0;

ProgressBar1.Position:=proc;

ProgressBar2.Position:=proc2;

dlina:=filesize(filereading);          // задаем размерность массива

setlength(bytebase,dlina);

 

while not eof(filereading) do     // считываем байты  файла

begin

blockread(filereading,buf,1); // считывание и запись из файла в буфер

bytebase[c]:=buf;

inc(c);

 if proc<>100 then proc:=((c*100) div dlina);  // описание прогресс бара

 ProgressBar1.Position:=proc;

end;

 

closefile(filereading); //закрываем

 

for i:=0 to 255 do               // таблица соответствий

begin

indexes[i]:=bytebase[i];

end;

 

for i:=0 to 255 do      // сопоставление индексов кодовым словам

begin

table[i].ind:=indexes[i];

table[i].code:=Listbox1.Items.strings[i];

end;

 

last:=bytebase[c-1]; // число нулей добивания последнего байта

 

stroka:='';  // чистка буферной строки

 

for j:=256 to dlina-2 do    // сбор строки кодовых слов

begin

strbuffer:='';

 

{if proc2<>100 then proc2:=(((j-255)*100) div (delina-257));  // описание прогресс бара

ProgressBar2.Position:=proc2;    }

 

for i:=0 to 7 do                     // перевод из byte в string

begin

if (bytebase[j] and (1 shl i)) = 0 then

strbuffer:='0'+strbuffer

else

strbuffer:='1'+strbuffer;

end;

 

stroka:=stroka+strbuffer;

end;

 

delete(stroka,(length(stroka)-last+1),last); // удалим нули добивания

stroka:=stroka+'g';                      // e - символ конца строки

le:=length(stroka);

 

delete(path,length(path)-3,4);           // возвращаем расширение

 

assignfile(filewriting,path);    // запись в файл последовательности индексов байт

rewrite(filewriting,1);

ka:=1; s4:=0; // счетчик  байт

lens:=length(stroka);

 

while stroka[ka]<>'g' do

begin

//Progressbar3.Position:=0;      

proc:=((ka*100) div lens);

ProgressBar2.Position:=proc;

 

if (stroka[ka]='1') then

begin

narstr:=copy(stroka,ka,3);

for z:=0 to 3 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1); // запись данных массива в файл

  end;

ka:=ka+3;

s4:=s4+1;

//Progressbar3.Position:=100;        

end

else

 

if (stroka[ka]='0') and (stroka[ka+1]='1') then

begin

narstr:=copy(stroka,ka,5);

for z:=4 to 11 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1); // запись данных массива в файл

  end;

ka:=ka+5;

s4:=s4+1;

//Progressbar3.Position:=100;         

end

else

 

if (stroka[ka]='0') and (stroka[ka+1]='0') and (stroka[ka+2]='1') then

begin

narstr:=copy(stroka,ka,7);

for z:=12 to 27 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1); // запись данных массива в файл

  end;

ka:=ka+7;

s4:=s4+1;

//Progressbar3.Position:=100;

end

else

 

if ((stroka[ka]='0') and (stroka[ka+1]='0') and (stroka[ka+2]='0') and (stroka[ka+3]='1')) then

begin

narstr:=copy(stroka,ka,9);

for z:=28 to 59 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1);

  end;

ka:=ka+9;

s4:=s4+1;

//Progressbar3.Position:=100;

end

else

 

if ((stroka[ka]='0') and (stroka[ka+1]='0') and (stroka[ka+2]='0') and (stroka[ka+3]='0') and (stroka[ka+4]='1')) then

begin

narstr:=copy(stroka,ka,11);

for z:=60 to 123 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1);

  end;

ka:=ka+11;

s4:=s4+1;

//Progressbar3.Position:=100;

end

else

 

if ((stroka[ka]='0') and (stroka[ka+1]='0') and (stroka[ka+2]='0') and (stroka[ka+3]='0') and (stroka[ka+4]='0') and (stroka[ka+5]='1')) then

begin

narstr:=copy(stroka,ka,13);

for z:=124 to 251 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1);

  end;

ka:=ka+13;

s4:=s4+1;

//Progressbar3.Position:=100;

end

else

 

if ((stroka[ka]='0') and (stroka[ka+1]='0') and (stroka[ka+2]='0') and (stroka[ka+3]='0') and (stroka[ka+4]='0') and (stroka[ka+5]='0')) then

begin

narstr:=copy(stroka,ka,15);

for z:=252 to 255 do

  if narstr=table[z].code then

  begin

  bt:=table[z].ind;

  blockwrite(filewriting,bt,1);

  end;

ka:=ka+15;

s4:=s4+1;

//Progressbar3.Position:=100;

end

else

inc(ka);

//break;

end;

//if stroka[ka]='e' then

//begin

showmessage('Восстановление файла завершено');

closefile(filewriting);

//end;

// close

end; // конец екзекута

end;

 

end.

 Приложение Б. Набор кодовых слов

 

111

110

101

100

01111

01101

01011

01001

01110

01100

01010

01000

0011111

0011011

0010111

0010011

0011101

0011001

0010101

0010001

0011110

0011010

0010110

0010010

0011100

0011000

0010100

0010000

000111111

000111110

000111101

000111100

000111011

000111010

000111001

000111000

000110111

000110110

000110101

000110100

000110011

000110010

000110001

000110000

000101111

000101110

000101101

000101100

000101011

000101010

000101001

000101000

000100111

000100110

000100101

000100100

000100011

000100010

000100001

000100000

00001111111

00001111110

00001111101

00001111100

00001111011

00001111010

00001111001

00001111000

00001110111

00001110110

00001110101

00001110100

00001110011

00001110010

00001110001

00001110000

00001101111

00001101110

00001101101

00001101100

00001101011

00001101010

00001101001

00001101000

00001100111

00001100110

00001100101

00001100100

00001100011

00001100010

00001100001

00001100000

00001011111

00001011110

00001011101

00001011100

00001011011

00001011010

00001011001

00001011000

00001010111

00001010110

00001010101

00001010100

00001010011

00001010010

00001010001

00001010000

00001001111

00001001110

00001001101

00001001100

00001001011

00001001010

00001001001

00001001000

00001000111

00001000110

00001000101

00001000100

00001000011

00001000010

00001000001

00001000000

0000011111111

0000011111110

0000011111101

0000011111100

0000011111011

0000011111010

0000011111001

0000011111000

0000011110111

0000011110110

0000011110101

0000011110100

0000011110011

0000011110010

0000011110001

0000011110000

0000011101111

0000011101110

0000011101101

0000011101100

0000011101011

0000011101010

0000011101001

0000011101000

0000011100111

0000011100110

0000011100101

0000011100100

0000011100011

0000011100010

0000011100001

0000011100000

0000011011111

0000011011110

0000011011101

0000011011100

0000011011011

0000011011010

0000011011001

0000011011000

0000011010111

0000011010110

0000011010101

0000011010100

0000011010011

0000011010010

0000011010001

0000011010000

0000011001111

0000011001110

0000011001101

0000011001100

0000011001011

0000011001010

0000011001001

0000011001000

0000011000111

0000011000110

0000011000101

0000011000100

0000011000011

0000011000010

0000011000001

0000011000000

0000010111111

0000010111110

0000010111101

0000010111100

0000010111011

0000010111010

0000010111001

0000010111000

0000010110111

0000010110110

0000010110101

0000010110100

0000010110011

0000010110010

0000010110001

0000010110000

0000010101111

0000010101110

0000010101101

0000010101100

0000010101011

0000010101010

0000010101001

0000010101000

0000010100111

0000010100110

0000010100101

0000010100100

0000010100011

0000010100010

0000010100001

0000010100000

0000010011111

0000010011110

0000010011101

0000010011100

0000010011011

0000010011010

0000010011001

0000010011000

0000010010111

0000010010110

0000010010101

0000010010100

0000010010011

0000010010010

0000010010001

0000010010000

0000010001111

0000010001110

0000010001101

0000010001100

0000010001011

0000010001010

0000010001001

0000010001000

0000010000111

0000010000110

0000010000101

0000010000100

0000010000011

0000010000010

0000010000001

0000010000000

000000111111111

000000111111110

000000111111101

000000111111100


Информация о работе Разработка программы сжатия файлов с помощью блочного кода