Автор работы: Пользователь скрыл имя, 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
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+'.
rewrite(filewriting,1); // перезаписываем данный файл
blockwrite(filewriting,
for i:=0 to 255 do // сопоставление индексов кодовым словам
begin
table[i].ind:=indexes[i];
table[i].code:=Listbox1.Items.
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].
table[j+1].code:=buffer;
end;
stroka:='';
last:=0;
for s:=0 to dlina-1 do // собираем строку
begin
stroka:=stroka+table[bytebase[
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.
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)-
stroka:=stroka+'g';
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
Информация о работе Разработка программы сжатия файлов с помощью блочного кода