unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, Spin, jpeg, ExtCtrls, Gauges;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
Image10: TImage;
procedure FormCreate(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Image4Click(Sender: TObject);
procedure Image6Click(Sender: TObject);
procedure Image5Click(Sender: TObject);
procedure Image9Click(Sender: TObject);
private
procedure GF_to_DEC;
procedure bin2dec(var tablica:array of integer);
procedure GF_mnozenie;
procedure GF_dodawanie;
procedure tworz_GF256;
procedure tworz_WGEN;
// procedure Wiel_mnoz;//(var licznik:integer;wiel_1:array of integer);
procedure Wiel_dziel(var xmx:array of integer;GF_WGEN:array of integer);
procedure start_kod;
procedure start_dekod;
procedure kodowanie;
procedure dekodowanie;
procedure waga_Hamm(var syndrom:array of integer);
end;
var
Form1: TForm1;
znakD,znakD2:integer;
tabHam:array[1..7] of integer;
tabHam2:array[1..7] of integer;
tablica:array[0..7] of integer;
tab:array[0..7] of integer;
tab2:array[0..7] of integer;
tab3:array[0..7] of integer;
tabDek:array[0..7] of integer;
gx:array[0..9] of integer;
wekt_kod:array[0..254]of byte;
tab_znak:array[0..7]of byte;
GF256:array[0..255,0..7]of integer;
GF_DEC:array[0..255] of integer;
GF_mnoz:array[0..255,0..255] of integer;
GF_dod:array[0..255,0..255] of integer;
GF_WGEN:array[0..129] of integer;
INF:array[0..124] of integer;
INF_DEK:array[0..254] of integer;
INF_KOR:array[0..254] of integer;
INF_TMP:array[0..254] of integer;
wiel_1:array[0..124]of integer;
iloczyn:array[0..129]of integer;
XMX:array[0..254]of integer; // iloczyn xn_k * mx //
syndrom:array[0..128]of integer; // reszta z dzielenia //
CX:array[0..254] of integer; //wektor kodowy //
F1:file of byte;
F2:file of byte;
F3:file of byte;
// F3:textfile;
Buf:array[1..125] of byte;
Buf2:array[1..255] of byte;
Ch: byte;
znak2,N_,K_,wybor,licznikGL,licznik,waga_H:integer;
go_kod:boolean;
implementation
uses Unit2, Unit3;
{$R *.DFM}
function FileExists(FileName: string): Boolean;
{ Boolean function that returns True if the file exists; otherwise,
it returns False. Closes the file if it exists. }
var
F: file;
begin
{$I-}
AssignFile(F, FileName);
FileMode := 0;
Reset(F);
CloseFile(F);
{$I+}
FileExists := (IOResult = 0) and (FileName <> '');
end; { FileExists }
// tworzenie ciala GF(256) //
procedure TForm1.tworz_GF256;
var degGF:integer;
i,k:integer;
begin
// pierwsze 9 wektorow //
for i:=0 to 8 do
begin
for k:=0 to 7 do
begin
GF256[i,k]:=0;
end;
end;
for i:=0 to 7 do GF256[i+1,i]:=1;
// kolejne wektory //
degGF:=256;
// for i:=1 to (degGF-1-3) do
for i:=1 to (degGF-1-8) do
begin
for k:=0 to 7 do
begin
// GF256[i+3,k]:=GF256[i,k] xor GF256[i+1,k];
GF256[i+8,k]:=GF256[i,k] xor GF256[i+2,k] xor GF256[i+3,k] xor GF256[i+4,k];
end;
end;
end;
// tworzenie tablicy wartosci dziesietnych ciala GF(256) //
procedure TForm1.GF_to_DEC;
var i,k,l,potega:integer;
begin
potega:=1;
znakD:=0;
for i:=0 to 255 do
begin
for k:=0 to 7 do
begin
for l:=0 to 6-k do
begin
potega:=2*potega;
end;
znakD:=znakD+(GF256[i,k]*potega);
potega:=1;
end;
GF_DEC[i]:=znakD;
znakD:=0;
end;
end;
// tabliczka mnozenia//
procedure TForm1.GF_mnozenie;
var i,j:integer;
begin
for i:=0 to 255 do GF_mnoz[0,i]:=0;
for i:=0 to 255 do GF_mnoz[i,0]:=0;
for i:=1 to 255 do
for j:=1 to 255 do
begin
if (i+j)<=256 then GF_mnoz[i,j]:=((i+j)-1)
else GF_mnoz[i,j]:=((i+j) mod 256);
end;
end;
// tabliczka dodawania//
procedure TForm1.GF_dodawanie;
var i,j,k:integer;
begin
for i:=0 to 255 do GF_dod[0,i]:=i;
for i:=0 to 255 do GF_dod[i,0]:=i;
for i:=1 to 255 do
for j:=1 to 255 do
begin
for k:=0 to 7 do
tablica[k]:=GF256[i,k] xor GF256[j,k];
bin2dec(tablica);
for k:=0 to 255 do
if GF_DEC[k]=znakD then GF_dod[i,j]:=k;
end;
end;
procedure TForm1.bin2dec;
var k,l,potega:integer;
begin
znakD:=0;
potega:=1;
znakD:=znakD+(tablica[7]*potega);
for k:=6 downto 0 do
begin
for l:=0 to 6-k do
begin
potega:=2*potega;
end;
znakD:=znakD+(tablica[k]*potega);
potega:=1;
end;
end;
procedure TForm1.tworz_WGEN;
var wiel_2:array[0..1] of integer;
wiel1,tmp_iloczyn,tmp_iloczyn2,iloczyn2:array[0..129]of integer;
i,j,k,w,deg_w2,m:integer;
begin
for i:=0 to 129 do wiel1[i]:=0; //zerowanie wielomianu 1//
wiel1[0]:=1;
wiel1[1]:=2; // wartosci poczatkowe [1 2] //
// zerowanie tablic //
for i:=0 to 129 do tmp_iloczyn[i]:=0;
for i:=0 to 129 do iloczyn[i]:=0;
// ustalanie wspolczynnikow wielomianu 2 //
for i:=0 to 1 do wiel_2[i]:=0;
wiel_2[0]:=1;
wiel_2[1]:=3;
deg_w2:=1;
i:=129;
licznik:=3;
repeat
//mnozenie wielomianow //
for k:=deg_w2 downto 0 do
begin
for m := i downto 0 do tmp_iloczyn[m]:=GF_mnoz[wiel_2[k],wiel1[m]];
for j:=129 downto 0 do tmp_iloczyn2[j]:=GF_dod[iloczyn[j],tmp_iloczyn[j]];
for j:=0 to 129 do iloczyn2[j]:=tmp_iloczyn2[j];
iloczyn[0]:=0;
for j:=1 to 129 do iloczyn[j]:=tmp_iloczyn2[j-1];
for w:=0 to 129 do tmp_iloczyn[w]:=0;
for w:=0 to 129 do tmp_iloczyn2[w]:=0;
end;
for w:=0 to 129 do iloczyn[w]:=0;
for i:=0 to 129 do wiel1[i]:=iloczyn2[i];
licznik:=licznik+1;
wiel_2[1]:=licznik;
until licznik=131;
for i:=0 to 129 do GF_WGEN[i]:=wiel1[i];
end;
// dzielenie wielominaow i liczenie syndromu//
procedure TForm1.Wiel_dziel;
var wiel_1,iloraz:array[0..254]of integer;
wiel_2,tmp_wiel1,wiel_tmp,wiel_tmp2,reszta2:array[0..129]of integer;
i,j,deg,deg_w1,deg_w2,licznik:integer;
begin
// zczytywanie stopni wielomianow //
deg_w1:=254;
deg_w2:=129;
// zerowanie tablic wielomianow //
for i:=0 to 254 do wiel_1[i]:=0;
for i:=0 to 129 do wiel_2[i]:=0;
for i:=0 to 254 do iloraz[i]:=0;
for i:=0 to 128 do syndrom[i]:=0;
for i:=0 to 129 do reszta2[i]:=0;
for i:=0 to 129 do tmp_wiel1[i]:=0;
// ustalanie wspolczynnikow wielomianow //
case wybor of
1: for i:=0 to 254 do wiel_1[i]:=XMX[i];
2: for i:=0 to 254 do wiel_1[i]:=INF_DEK[i];
3: for i:=0 to 254 do wiel_1[i]:=INF_TMP[i];
end;
for i:=0 to 129 do wiel_2[i]:=GF_WGEN[i];
licznik:=deg_w2+1;
deg:=(deg_w1-deg_w2);
for i:=0 to 129 do tmp_wiel1[i]:=wiel_1[i];
for i:=0 to deg do
begin
iloraz[i]:=GF_mnoz[tmp_wiel1[0],wiel_2[0]];
for j:=0 to deg_w2 do wiel_tmp[j]:=GF_mnoz[iloraz[i],wiel_2[j]];
for j:=0 to deg_w2 do wiel_tmp2[j]:=GF_dod[tmp_wiel1[j],wiel_tmp[j]];
if i<deg then
begin
for j:=0 to deg_w2-1 do wiel_tmp2[j]:=wiel_tmp2[j+1];
wiel_tmp2[deg_w2]:=wiel_1[licznik];
for j:=0 to 129 do tmp_wiel1[j]:=wiel_tmp2[j];
licznik:=licznik+1;
end
else for j:=0 to deg_w2-1 do wiel_tmp2[j]:=wiel_tmp2[j+1];
end;
for i:=0 to 128 do syndrom[i]:=wiel_tmp2[i];
end;
//kodowanie//
procedure TForm1.kodowanie;
var i,j,w:integer;
begin
wybor:=1;
//1.krok algorytmu - tworzenie wektora XMX //
for i:=0 to 124 do XMX[i]:=INF[i];
for i:=125 to 254 do XMX[i]:=0;
//2.krok algorytmu - XMX podzielic przez W_GEN //
Wiel_dziel(XMX,GF_WGEN);
//3.krok algorytmu - dodanie XMX i reszty z dzielenia//
for i:=0 to 125 do CX[i]:=XMX[i];
for i:=0 to 128 do CX[i+126]:=syndrom[i];
//zapis do pliku//
for j:=0 to 254 do
begin
w:=CX[j];
Ch:=GF_DEC[w];
Write(F1,Ch);
end;
K_:=K_+1;
end;
//dekodowanie//
procedure TForm1.dekodowanie;
var i,j,w,k,licznik:integer;
OK:boolean;
begin
wybor:=2;
OK:=false;
// obliczanie syndromu
Wiel_dziel(INF_DEK,GF_WGEN);
waga_Hamm(syndrom);
if waga_H<=65 then
begin
for i:=0 to 125 do INF_KOR[i]:=INF_DEK[i];
for i:=0 to 128 do INF_KOR[i+126]:=GF_dod[INF_DEK[i+126],syndrom[i]];
//zapis do pliku//
for j:=0 to 254 do
begin
w:=INF_KOR[j];
Ch:=GF_DEC[w];
Write(F1,Ch);
if j<=124 then Write(F3,Ch);
end;
//koniec zapisu//
end
else
begin
licznik:=0;
repeat
for j:=0 to 253 do INF_TMP[j+1]:=INF_DEK[j];
INF_TMP[0]:=INF_DEK[254];
for j:=0 to 254 do INF_DEK[j]:=INF_TMP[j];
wybor:=3;
Wiel_dziel(INF_TMP,GF_WGEN);
waga_Hamm(syndrom);
if waga_H<=65 then
begin
for j:=0 to 125 do INF_KOR[j]:=INF_TMP[j];
for j:=0 to 128 do INF_KOR[j+126]:=GF_dod[INF_TMP[j+126],syndrom[j]];
// for k:=1 to licznikP do
for k:=1 to licznik+1 do
begin
for j:=1 to 254 do INF_DEK[j-1]:=INF_KOR[j];
INF_DEK[254]:=INF_KOR[0];
for w:=0 to 254 do INF_KOR[w]:=INF_DEK[w];
end;
OK:=true;
end;
licznik:=licznik+1;
until (licznik=255) (*(licznikP=255)*)or (OK=true);
// if OK=true then
// begin
//zapis do pliku//
for j:=0 to 254 do
begin
w:=INF_KOR[j];
Ch:=GF_DEC[w];
Write(F1,Ch);
if j<=124 then Write(F3,Ch);
end;
//koniec zapisu//
// end
// else begin
// Ch:=65;
// Write(F1,Ch);
// end;
end;
end;
procedure TForm1.start_kod;
var i,j,k,w,ile,licznik,rozmiar:integer;
begin
for i:=0 to 124 do INF[i]:=0;
if go_kod=true then
begin
Image7.Visible:=false;
Image8.Visible:=true;
AssignFile(F2, OpenDialog1.Filename);
Reset(F2);
rozmiar:=FileSize(F2);
AssignFile(F1, 'kod.RS' );
Rewrite(F1);
K_:=0;
ile:=1;
for licznik:=1 to rozmiar do
begin
image8.Refresh;
Read(F2,Ch);
Buf[ile]:=Ch;
if ile=125 then
begin
for i:=1 to 125 do
begin
for j:=0 to 255 do
begin
if GF_DEC[j]=Buf[i] then INF[i-1]:=j;
end;
end;
kodowanie;
// for w:=0 to 124 do INF[w]:=0;
ile:=0;
end;
ile:=ile+1;
for w:=0 to 124 do INF[w]:=0;
end;
if ile>1 then
begin
for k:=ile to 125 do Buf[k]:=32;
for i:=1 to 125 do
begin
for j:=0 to 255 do
begin
if GF_DEC[j]=Buf[i] then INF[i-1]:=j;
end;
end;
// for k:=ile to 125 do INF[k-1]:=0;
kodowanie;
// for w:=0 to 124 do INF[w]:=0;
end;
CloseFile(F1);
CloseFile(F2);
for w:=0 to 124 do INF[w]:=0;
j:=0;
for i:=1 to 100000000 do begin j:=j*i end;
image8.Visible:=false;
Image7.Visible:=true;
end
else
begin
form2.show;
go_kod:=false;
end;
end;
procedure TForm1.start_dekod;
var i,j,k,w,licznik,rozmiar,ile:integer;
begin
if go_kod=true then
begin
i:=0;
Image10.Visible:=true;
AssignFile(F2, OpenDialog1.Filename);
Reset(F2);
rozmiar:=FileSize(F2);
AssignFile(F1, 'skoryg.txt' );
Rewrite(F1);
AssignFile(F3, 'skoryg2.txt' );
Rewrite(F3);
Image7.Visible:=false;
K_:=0;
ile:=1;
(* licznikGL:=rozmiar div 255;
for i:=1 to rozmiar do
begin
image10.Refresh;
Read(F2,Ch);
Buf2[i]:=Ch;
end;
for i:=0 to licznikGL-1 do
begin
for k:=1 to 255 do
begin
for j:=0 to 255 do if GF_DEC[j]=Buf2[k+255*i] then INF_DEK[k-1]:=j;
end;
dekodowanie;
// for w:=0 to 254 do INF_DEK[w]:=0;
end; *)
(* for licznikGL:=1 to rozmiar do
begin
image10.Refresh;
Read(F2,Ch);
for j:=0 to 255 do if GF_DEC[j]=Ch then INF_DEK[ile-1]:=j;
if ile=255 then
begin
if INF_DEK[125]=3 then INF_DEK[125]:=0;
dekodowanie;
ile:=0;
end;
ile:=ile+1;
end;*)
if rozmiar>=255 then
begin
for licznik:=1 to rozmiar do
begin
image10.Refresh;
Read(F2,Ch);
Buf2[ile]:=Ch;
if ile=255 then
begin
for i:=1 to 255 do
begin
for j:=0 to 255 do if GF_DEC[j]=Buf2[i] then INF_DEK[i-1]:=j;
end;
if INF_DEK[125]=3 then INF_DEK[125]:=0;
dekodowanie;
ile:=0;
end;
ile:=ile+1;
end;
end
else
begin
for licznik:=1 to rozmiar do
begin
image10.Refresh;
Read(F2,Ch);
Buf2[licznik]:=Ch;
for j:=0 to 255 do if GF_DEC[j]=Buf2[licznik] then INF_DEK[licznik-1]:=j;
end;
for i:=rozmiar to 255 do INF_DEK[i]:=0;
if INF_DEK[125]=3 then INF_DEK[125]:=0;
dekodowanie; end;
CloseFile(F1);
CloseFile(F2);
CloseFile(F3);
j:=0;
for i:=1 to 100000000 do begin j:=j*i end;
Image10.Visible:=false;
Image7.Visible:=true;
end
else form2.show;
go_kod:=false;
end;
procedure TForm1.waga_Hamm;
var i:integer;
begin
waga_H:=0;
for i:=0 to 128 do
begin
if syndrom[i]>0 then waga_H:=waga_H+1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
go_kod:=false;
AssignFile(F2,'kod.RS');
if FileExists('kod.RS') then begin end
else begin
Rewrite(F2);
CloseFile(F2);
end;
tworz_GF256;
GF_to_DEC;
GF_mnozenie;
GF_dodawanie;
tworz_WGEN;
end;
procedure TForm1.Image2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Image4Click(Sender: TObject);
begin
Image7.Visible:=false;
OpenDialog1.Filter := 'Pliki tekstowe (*.txt)|*.txt|Pliki RS (*.RS)|*.RS|Wszystkie pliki (*.*)|*.*';
OpenDialog1.FilterIndex := 1;
if OpenDialog1.Execute then
begin
go_kod:=true;
end;
end;
procedure TForm1.Image5Click(Sender: TObject);
begin
start_kod;
go_kod:=false;
end;
procedure TForm1.Image6Click(Sender: TObject);
begin
start_dekod;
go_kod:=false;
end;
procedure TForm1.Image9Click(Sender: TObject);
begin
form3.show;
end; end