Лабораторная работа №3 - файл n36.doc

Лабораторная работа №3
скачать (151.5 kb.)
Доступные файлы (53):
n1.bpr
n2.cpp
n3.exe
n4.cpp
n5.ddp
n6.dfm
n7.h
hamming.input.txt1kb.20.11.2005 08:00скачать
hamming.output.txt1kb.26.11.2005 21:28скачать
n10.bpr
n11.cpp
n12.exe
n13.cpp
n14.ddp
n15.dfm
n16.h
hamming.error.input.txt1kb.26.11.2005 21:51скачать
hamming.input.txt1kb.26.11.2005 20:23скачать
n19.bpr
n20.cpp
n21.exe
n22.cpp
n23.ddp
n24.dfm
n25.h
even.input.txt1kb.20.11.2005 08:00скачать
even.output.txt1kb.26.11.2005 20:06скачать
n28.bpr
n29.cpp
n30.exe
n31.cpp
n32.dfm
n33.h
even.error.input.txt1kb.26.11.2005 20:04скачать
even.input.txt1kb.26.11.2005 16:35скачать
n36.doc202kb.24.05.2006 16:53скачать
n37.bpr
n38.cpp
n39.exe
n40.cpp
n41.dfm
n42.h
crc.input.txt1kb.20.11.2005 08:00скачать
crc.output.txt1kb.26.11.2005 22:29скачать
n45.bpr
n46.cpp
n47.exe
n48.cpp
n49.ddp
n50.dfm
n51.h
crc.error.input.txt1kb.26.11.2005 23:00скачать
crc.input.txt1kb.26.11.2005 22:02скачать
Победи орков

Доступно в Google Play

n36.doc

Уфимский Государственный Авиационный Технический Университет
Кафедра ТК
Отчет по лабораторной работе №3

Изучение защищающих от ошибок кодов

по курсу «Сети ЭВМ»
Вариант

Выполнил:

студент гр.Т28-420

Принял:

Рыжов Г.И.

Уфа 2005

Цель работы

Целью работы является изучение кодов, защищающих от ошибок, используемых в системах распределенной обработки данных.
Задание

Написать программы реализующие следующие методы кодирования: кодирование с проверкой на четность, метод Хэмминга, циклическое кодирование. С помощью данных методов закодировать сообщение используя в алфавита таблицу символов КОИ-7. Исследовать для каждого метода канал передачи данных в котором возможны 1,2,3 ошибки.


Листинг программы, реализующей код с проверкой на четность. Кодер.

Coder.cpp



#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Main.cpp



#include <vcl.h>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;
int *TfrmMain::ansi2ascii(AnsiString ansiInput)

{

char *asciiChar;

asciiChar = ansiInput.c_str();
int *asciiInt;

asciiInt = new int [ansiInput.Length()+1];
for (int i=0;i<=ansiInput.Length();i++)

{

asciiInt[i] = asciiChar[i];

}

return asciiInt;

};

int asciiSymbol2koi(int asciiSymbol)

{

switch (asciiSymbol)

{

case 'A' : return 101; break;

case 'B' : return 102; break;

case 'C' : return 103; break;

case 'D' : return 104; break;

case 'E' : return 105; break;

case 'F' : return 106; break;

case 'G' : return 107; break;

case 'H' : return 110; break;

case 'I' : return 111; break;

case 'J' : return 112; break;

case 'K' : return 113; break;

case 'L' : return 114; break;

case 'M' : return 115; break;

case 'N' : return 116; break;

case 'O' : return 117; break;

case 'P' : return 120; break;

case 'Q' : return 121; break;

case 'R' : return 122; break;

case 'S' : return 123; break;

case 'T' : return 124; break;

case 'U' : return 125; break;

case 'V' : return 126; break;

case 'W' : return 127; break;

case 'X' : return 130; break;

case 'Y' : return 131; break;

case 'Z' : return 132; break;

case ' ' : return 39; break;

default : return 0;

}

}

int *TfrmMain::ascii2koi(int *asciiInput)

{

int Length=0;

while(asciiInput[Length]!='\0') Length++;
int *koi;

koi = new int [Length+1];
for (int i=0;i<=Length;i++)

koi[i] = asciiSymbol2koi(asciiInput[i]);
return koi;

};

int *int2bit(int number, int N)

{

int *bit;

bit = new int[N+1];

for (int i=0;i<=N;i++) bit[i]=0;
int i=N;

int tmp=0;

while (number!=0)

{

tmp = fmod(number,2);

bit[i]=tmp;

number = number/2;

i--;

}

return bit;

}

int **TfrmMain::koi2bit(int *koiInput, int N)

{

int Length=0;

while(koiInput[Length]!=0) Length++;
int **bits;

bits = new int *[Length+1];

for (int i=0;i<=Length;i++)

{

bits[i] = int2bit(koiInput[i],N);

}

return bits;

};;

void TfrmMain::ShowBits(TMemo *Memo, int **bits, int Length, int N)

{

for (int i=0;i<=Length;i++)

{

AnsiString temp="";

for (int j=1;j<=N;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}
}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

int *evenMethod(int **bits,int Length, int N)

{

int *even;

even = new int [Length+1];

for(int i=0; i<=Length; i++)

{

even[i]=0;

for (int j=1;j<=N;j++)

even[i] = xor(even[i],bits[i][j]);

}

return even;

}

void SaveToFileEven(AnsiString FileName, int **bits, int *even, int Length, int N)

{

FILE *file;

file = fopen(FileName.c_str(),"w");

for (int i=0; i<=Length; i++)

{

for (int j=0; j<=N; j++)

fprintf(file,"%i",bits[i][j]);

fprintf(file,"%i",even[i]);

fprintf(file,"\n");

}

fclose(file);

}

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

evenOutputFile = "";

hammingOutputFile = "";

crcOutputFile = "";

InputFile="even.input.txt";

mmInput->Lines->LoadFromFile(InputFile);
ansiMessage = mmInput->Lines->Text;

asciiMessage = ansi2ascii(ansiMessage);

koiMessage = ascii2koi(asciiMessage);

bitMessage = koi2bit(koiMessage, 8);

ShowBits(mmOutput,bitMessage,ansiMessage.Length()-1,8);
int *even;

even = evenMethod(bitMessage,ansiMessage.Length(),8);

for (int i=0;i<=ansiMessage.Length();i++)

mmMethod->Lines->Add(IntToStr(even[i]));


SaveToFileEven("even.output.txt", bitMessage, even, ansiMessage.Length()-1,8);
}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}


Листинг программы, реализующей код с проверкой на четность. Декодер.

Decoder.cpp



#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}


main.cpp
#include <vcl.h>

#include <dir.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

InputFile = "";

N = 9;
}
void TfrmMain::ShowBits(TMemo *Memo, int **bits, int len, int count)

{

for (int i=0;i<=len;i++)

{

AnsiString temp="";

for (int j=1;j<=count;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}
}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

int CorrectChecking(int *word, int len, int bit)

{

int sum = 0;

for (int i=1;i<=len;i++)

{

sum = xor(sum,word[i]);

}

return xor(sum,bit);

}

int *GetErrors(int **words, int len, int count)

{

int *ans;

ans = new int [len+1];

for (int i=0;i<=len;i++)

ans[i] = CorrectChecking(words[i],count-1,words[i][count]);

return ans;

}

void __fastcall TfrmMain::btnOpenClick(TObject *Sender)

{

if ((OpenDialog->Execute())&&(FileExists(OpenDialog->FileName)))

InputFile = OpenDialog->FileName;

mmInput->Lines->LoadFromFile(InputFile);


FILE *file;

file = fopen(InputFile.c_str(),"r");
Length = mmInput->Lines->Count;

Length--;

even = new int *[Length+1];
errors = new int [Length+1];
char ch;

for (int i=0;i<=Length;i++)

{

even[i] = new int [N+1];

even[i][0] = 0;

int j=0;

do

{

fscanf(file,"%c",&ch);

if (ch=='0') even[i][j] = 0;

if (ch=='1') even[i][j] = 1;

j++;

}while ((ch!='\n')&&(!feof(file)));

}

errors = GetErrors(even,Length,9);
for (int j=0;j<=Length;j++)

mmResult->Lines->Add(errors[j]);

}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}

Листинг программы, реализующей код Хэмминга. Кодер.
coder.cpp
#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Main.cpp



#include <vcl.h>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

int *TfrmMain::ansi2ascii(AnsiString ansiInput)

{

char *asciiChar;

asciiChar = ansiInput.c_str();
int *asciiInt;

asciiInt = new int [ansiInput.Length()+1];
for (int i=0;i<=ansiInput.Length();i++)

{

asciiInt[i] = asciiChar[i];

}

return asciiInt;

};

int asciiSymbol2koi(int asciiSymbol)

{

switch (asciiSymbol)

{

case 'A' : return 101; break;

case 'B' : return 102; break;

case 'C' : return 103; break;

case 'D' : return 104; break;

case 'E' : return 105; break;

case 'F' : return 106; break;

case 'G' : return 107; break;

case 'H' : return 110; break;

case 'I' : return 111; break;

case 'J' : return 112; break;

case 'K' : return 113; break;

case 'L' : return 114; break;

case 'M' : return 115; break;

case 'N' : return 116; break;

case 'O' : return 117; break;

case 'P' : return 120; break;

case 'Q' : return 121; break;

case 'R' : return 122; break;

case 'S' : return 123; break;

case 'T' : return 124; break;

case 'U' : return 125; break;

case 'V' : return 126; break;

case 'W' : return 127; break;

case 'X' : return 130; break;

case 'Y' : return 131; break;

case 'Z' : return 132; break;

case ' ' : return 39; break;

default : return 0;

}

}

int *TfrmMain::ascii2koi(int *asciiInput)

{

int Length=0;

while(asciiInput[Length]!='\0') Length++;
int *koi;

koi = new int [Length+1];
for (int i=0;i<=Length;i++)

koi[i] = asciiSymbol2koi(asciiInput[i]);
return koi;

};

int *int2bit(int number, int N)

{

int *bit;

bit = new int[N+1];

for (int i=0;i<=N;i++) bit[i]=0;
int i=N;

int tmp=0;

while (number!=0)

{

tmp = fmod(number,2);

bit[i]=tmp;

number = number/2;

i--;

}

return bit;

}

int **TfrmMain::koi2bit(int *koiInput, int N)

{

int Length=0;

while(koiInput[Length]!=0) Length++;
int **bits;

bits = new int *[Length+1];

for (int i=0;i<=Length;i++)

{

bits[i] = int2bit(koiInput[i],N);

}

return bits;

};

void TfrmMain::ShowBits(TMemo *Memo, int **bits, int Length, int N)

{

for (int i=0;i<=Length;i++)

{

AnsiString temp="";

for (int j=1;j<=N;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}

}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

int **TfrmMain::hammingMethod(int **bits,int Length, int N)

{

int **hamming = new int *[Length+1];

for (int i=0;i<=Length;i++)

hamming[i] = new int[4];
for (int i=0; i<=Length; i++)

{

int **t;

t = new int *[N+1];
for (int j=1; j<=N; j++)

if (bits[i][j]==1)

{

int tmp = j;

if (j==1) tmp = 3;

if (j==2) tmp = 5;

if (j==3) tmp = 6;

if (j==4) tmp = 7;

if (j==5) tmp = 9;

if (j==6) tmp = 10;

if (j==7) tmp = 11;

if (j==8) tmp = 12;

t[j-1] = int2bit(tmp,4);

}

else

t[j-1] = int2bit(0,4);

t[N] = int2bit(0,4);
int *sum;

sum = new int[5];

for (int j=0; j<=4; j++)

sum[j] = 0;
for (int k=0; k<=4; k++)

for (int j=0; j<=N; j++)

sum[k] = xor(sum[k],t[j][k]);
hamming[i] = sum;

}

return hamming;

}

int **TfrmMain::InvertBit(int **bits,int Length, int N)

{

int **invert;

invert = new int *[Length+1];

for (int i=0;i<=Length;i++)

{

invert [i] = new int[N+1];

for (int j=1;j<=N;j++)

invert[i][1+N-j] = bits[i][j];

}

return invert;

}

void SaveToFileHamming(AnsiString FileName, int **bits, int **hamming, int Length)

{

FILE *file;

file = fopen(FileName.c_str(),"w");

for (int i=0; i<=Length; i++)

{

fprintf(file,"%i",hamming[i][4]);

fprintf(file,"%i",hamming[i][3]);

fprintf(file,"%i",bits[i][8]);

fprintf(file,"%i",hamming[i][2]);

fprintf(file,"%i",bits[i][7]);

fprintf(file,"%i",bits[i][6]);

fprintf(file,"%i",bits[i][5]);

fprintf(file,"%i",hamming[i][1]);

fprintf(file,"%i",bits[i][4]);

fprintf(file,"%i",bits[i][3]);

fprintf(file,"%i",bits[i][2]);

fprintf(file,"%i",bits[i][1]);

fprintf(file,"\n");

}

fclose(file);

}

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

hammingOutputFile = "";

InputFile="hamming.input.txt";

mmInput->Lines->LoadFromFile(InputFile);
ansiMessage = mmInput->Lines->Text;

asciiMessage = ansi2ascii(ansiMessage);

koiMessage = ascii2koi(asciiMessage);

bitMessage = koi2bit(koiMessage, 8);

ShowBits(mmOutput,bitMessage,ansiMessage.Length()-1,8);
int **invBitMessage;
invBitMessage = InvertBit(bitMessage,ansiMessage.Length()-1,8);

hamming = hammingMethod(invBitMessage,ansiMessage.Length()-1,8);
ShowBits(mmMethod,hamming,ansiMessage.Length()-1,4);
SaveToFileHamming("hamming.output.txt", bitMessage, hamming, ansiMessage.Length()-1);

}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}


Листинг программы, реализующей код Хэмминга. Декодер.
Decoder.cpp
#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Main.cpp



#include <vcl.h>

#include <dir.h>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"
#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

InputFile = "";

N = 12;
};
void TfrmMain::ShowBits(TMemo *Memo, int **bits, int len, int count)

{

for (int i=0;i<=len;i++)

{

AnsiString temp="";

for (int j=1;j<=count;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}
}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

int *int2bit(int number, int N)

{

int *bit;

bit = new int[N+1];

for (int i=0;i<=N;i++) bit[i]=0;
int i=N;

int tmp=0;

while (number!=0)

{

tmp = fmod(number,2);

bit[i]=tmp;

number = number/2;

i--;

}

return bit;

};

int *XorArrays(int *array1,int *array2, int len)

{

int *res;

res = new int [len+1];

for (int i=0;i<=len;i++)

res[i] = xor(array1[i],array2[i]);

return res;

}

int *CorrectChecking(int *word, int len)

{

int *sum;

sum = new int [len+1];

for (int i=0; i<=len;i++)

sum[i] = 0;

int *nullArray;

nullArray = new int [len+1];

for (int i=0;i<=len;i++)

nullArray[i] = 0;
for (int i=1;i<=len;i++)

{

if (!word[i]) sum = XorArrays(sum,nullArray, len);

else sum = XorArrays(sum,int2bit(i,4),len);

}

return sum;

}

int **GetErrors(int **words, int len, int count)

{

int **ans;

ans = new int *[len+1];
for (int i=0;i<=len;i++)

ans[i] = CorrectChecking(words[i],count);

return ans;

}

void __fastcall TfrmMain::btnOpenClick(TObject *Sender)

{

if ((OpenDialog->Execute())&&(FileExists(OpenDialog->FileName)))

InputFile = OpenDialog->FileName;

mmInput->Lines->LoadFromFile(InputFile);


FILE *file;

file = fopen(InputFile.c_str(),"r");
Length = mmInput->Lines->Count;

Length--;

hamming = new int *[Length+1];
errors = new int *[Length+1];
char ch;

for (int i=0;i<=Length;i++)

{

hamming[i] = new int [N+1];

hamming[i][0] = 0;

int j=0;

do

{

fscanf(file,"%c",&ch);

if (ch=='0') hamming[i][j+1] = 0;

if (ch=='1') hamming[i][j+1] = 1;

j++;

}

while ((ch!='\n')&&(!feof(file)));

}
// ShowBits(mmResult,hamming,Length,12);

errors = GetErrors(hamming,Length,12);
ShowBits(mmResult,errors,Length,4);

fclose(file);

}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}

Листинг программы, реализующей циклическое кодирование. Кодер.
Coder.cpp
#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Main.cpp



#include <vcl.h>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

int *TfrmMain::ansi2ascii(AnsiString ansiInput)

{

char *asciiChar;

asciiChar = ansiInput.c_str();
int *asciiInt;

asciiInt = new int [ansiInput.Length()+1];
for (int i=0;i<=ansiInput.Length();i++)

{

asciiInt[i] = asciiChar[i];

}

return asciiInt;

};

int asciiSymbol2koi(int asciiSymbol)

{

switch (asciiSymbol)

{

case 'A' : return 101; break;

case 'B' : return 102; break;

case 'C' : return 103; break;

case 'D' : return 104; break;

case 'E' : return 105; break;

case 'F' : return 106; break;

case 'G' : return 107; break;

case 'H' : return 110; break;

case 'I' : return 111; break;

case 'J' : return 112; break;

case 'K' : return 113; break;

case 'L' : return 114; break;

case 'M' : return 115; break;

case 'N' : return 116; break;

case 'O' : return 117; break;

case 'P' : return 120; break;

case 'Q' : return 121; break;

case 'R' : return 122; break;

case 'S' : return 123; break;

case 'T' : return 124; break;

case 'U' : return 125; break;

case 'V' : return 126; break;

case 'W' : return 127; break;

case 'X' : return 130; break;

case 'Y' : return 131; break;

case 'Z' : return 132; break;

case ' ' : return 39; break;

default : return 0;

}

}

int *TfrmMain::ascii2koi(int *asciiInput)

{

int Length=0;

while(asciiInput[Length]!='\0') Length++;
int *koi;

koi = new int [Length+1];
for (int i=0;i<=Length;i++)

koi[i] = asciiSymbol2koi(asciiInput[i]);
return koi;

};

int *int2bit(int number, int N)

{

int *bit;

bit = new int[N+1];

for (int i=0;i<=N;i++) bit[i]=0;
int i=N;

int tmp=0;

while (number!=0)

{

tmp = fmod(number,2);

bit[i]=tmp;

number = number/2;

i--;

}

return bit;

}

int **TfrmMain::koi2bit(int *koiInput, int N)

{

int Length=0;

while(koiInput[Length]!=0) Length++;
int **bits;

bits = new int *[Length+1];

for (int i=0;i<=Length;i++)

{

bits[i] = int2bit(koiInput[i],N);

}

return bits;

};

void TfrmMain::ShowBits(TMemo *Memo, int **bits, int Length, int N)

{

for (int i=0;i<=Length;i++)

{

AnsiString temp="";

for (int j=1;j<=N;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}
}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

void MoveArray(int *bits, int N, int insert)

{

for(int i=1;i<=N;i++)

{

bits[i-1]=bits[i];

}

bits[N]=insert;

}

int *XorArrays(int *array1, int *array2,int N)

{

int *res = new int [N+1];

for (int i=0;i<=N;i++)

res[i]=xor(array1[i],array2[i]);
return res;

}

int **TfrmMain::crcMethod(int **bits,int Length, int N)

{

int **res = new int *[Length+1];

for (int i=0;i<=Length;i++)

res[i] = new int[5];

for(int i=0;i<=Length;i++)

for(int j=0;j<=4;j++)

res[i][j]=0;
int *polynom = new int [5];

polynom[1]=1;

polynom[2]=0;

polynom[3]=1;

polynom[4]=1;
for (int i=0; i<=Length; i++)

{

int *tmp = new int [5];

tmp[1] = bits[i][1];

tmp[2] = bits[i][2];

tmp[3] = bits[i][3];

tmp[4] = bits[i][4];

int current = 5;
while (current <= N+4)

{

tmp = XorArrays(tmp,polynom,4);

while ((tmp[1]==0)&&(current<=N+4))

{

if (current <= N)

{

MoveArray(tmp,4,bits[i][current]);

current++;

}

else

{

MoveArray(tmp,4,0);

current++;

}

}

}

res[i] = tmp;

}

return res;

}

void SaveToFileCRC(AnsiString FileName, int **bits, int **crc, int Length)

{

FILE *file;

file = fopen(FileName.c_str(),"w");

for (int i=0; i<=Length; i++)

{

for (int j=1; j<=8; j++)

fprintf(file,"%i",bits[i][j]);
for (int j=1; j<=4;j++)

fprintf(file,"%i",crc[i][j]);

fprintf(file,"\n");

}

fclose(file);

}

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

crcOutputFile = "";

InputFile="crc.input.txt";

mmInput->Lines->LoadFromFile(InputFile);
ansiMessage = mmInput->Lines->Text;

asciiMessage = ansi2ascii(ansiMessage);

koiMessage = ascii2koi(asciiMessage);

bitMessage = koi2bit(koiMessage, 8);

ShowBits(mmOutput,bitMessage,ansiMessage.Length()-1,8);
crc = crcMethod(bitMessage,ansiMessage.Length()-1,8);
ShowBits(mmMethod,crc,ansiMessage.Length()-1,4);
SaveToFileCRC("crc.output.txt", bitMessage, crc, ansiMessage.Length()-1);

}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}


Листинг программы, реализующей циклическое кодирование. Декодер.
Decoder.cpp
#include <vcl.h>

#pragma hdrstop

USEFORM("Main.cpp", frmMain);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

}

catch (Exception &exception)

{ Application->ShowException(&exception); }

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Main.cpp



#include <vcl.h>

#include <math.h>

#include <stdio.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

int *TfrmMain::ansi2ascii(AnsiString ansiInput)

{

char *asciiChar;

asciiChar = ansiInput.c_str();
int *asciiInt;

asciiInt = new int [ansiInput.Length()+1];
for (int i=0;i<=ansiInput.Length();i++)

{

asciiInt[i] = asciiChar[i];

}

return asciiInt;

};

int asciiSymbol2koi(int asciiSymbol)

{

switch (asciiSymbol)

{

case 'A' : return 101; break;

case 'B' : return 102; break;

case 'C' : return 103; break;

case 'D' : return 104; break;

case 'E' : return 105; break;

case 'F' : return 106; break;

case 'G' : return 107; break;

case 'H' : return 110; break;

case 'I' : return 111; break;

case 'J' : return 112; break;

case 'K' : return 113; break;

case 'L' : return 114; break;

case 'M' : return 115; break;

case 'N' : return 116; break;

case 'O' : return 117; break;

case 'P' : return 120; break;

case 'Q' : return 121; break;

case 'R' : return 122; break;

case 'S' : return 123; break;

case 'T' : return 124; break;

case 'U' : return 125; break;

case 'V' : return 126; break;

case 'W' : return 127; break;

case 'X' : return 130; break;

case 'Y' : return 131; break;

case 'Z' : return 132; break;

case ' ' : return 39; break;

default : return 0;

}

}

int *TfrmMain::ascii2koi(int *asciiInput)

{

int Length=0;

while(asciiInput[Length]!='\0') Length++;
int *koi;

koi = new int [Length+1];
for (int i=0;i<=Length;i++)

koi[i] = asciiSymbol2koi(asciiInput[i]);
return koi;

};

int *int2bit(int number, int N)

{

int *bit;

bit = new int[N+1];

for (int i=0;i<=N;i++) bit[i]=0;
int i=N;

int tmp=0;

while (number!=0)

{

tmp = fmod(number,2);

bit[i]=tmp;

number = number/2;

i--;

}

return bit;

}

int **TfrmMain::koi2bit(int *koiInput, int N)

{

int Length=0;

while(koiInput[Length]!=0) Length++;
int **bits;

bits = new int *[Length+1];

for (int i=0;i<=Length;i++)

{

bits[i] = int2bit(koiInput[i],N);

}

return bits;

};;

void TfrmMain::ShowBits(TMemo *Memo, int **bits, int Length, int N)

{

for (int i=0;i<=Length;i++)

{

AnsiString temp="";

for (int j=1;j<=N;j++)

temp += IntToStr(bits[i][j]);

Memo->Lines->Add(temp);

}
}

int xor(int x, int y)

{

if ((!x)&&(!y)) return 0;

if ((!x)&&(y)) return 1;

if ((x)&&(!y)) return 1;

if ((x)&&(y)) return 0;

}

void MoveArray(int *bits, int N, int insert)

{

for(int i=1;i<=N;i++)

{

bits[i-1]=bits[i];

}

bits[N]=insert;

}

int *XorArrays(int *array1, int *array2,int N)

{

int *res = new int [N+1];

for (int i=0;i<=N;i++)

res[i]=xor(array1[i],array2[i]);
return res;

}

int **TfrmMain::crcMethod(int **bits,int Length, int N)

{

int **res = new int *[Length+1];

for (int i=0;i<=Length;i++)

res[i] = new int[5];

for(int i=0;i<=Length;i++)

for(int j=0;j<=4;j++)

res[i][j]=0;

int *polynom = new int [5];

polynom[1]=1;

polynom[2]=0;

polynom[3]=1;

polynom[4]=1;

for (int i=0; i<=Length; i++)

{

int *tmp = new int [5];

tmp[1] = bits[i][1];

tmp[2] = bits[i][2];

tmp[3] = bits[i][3];

tmp[4] = bits[i][4];

int current = 5;
while (current <= N+4)

{

tmp = XorArrays(tmp,polynom,4);

while ((tmp[1]==0)&&(current<=N+4))

{

if (current <= N)

{

MoveArray(tmp,4,bits[i][current]);

current++;

}else{

MoveArray(tmp,4,0);

current++;}

}

}

res[i] = tmp;

}

return res;

}

void SaveToFileCRC(AnsiString FileName, int **bits, int **crc, int Length)

{

FILE *file;

file = fopen(FileName.c_str(),"w");

for (int i=0; i<=Length; i++)

{

for (int j=1; j<=8; j++)

fprintf(file,"%i",bits[i][j]);

for (int j=1; j<=4;j++)

fprintf(file,"%i",crc[i][j]);

fprintf(file,"\n");

}

fclose(file);

}

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

crcOutputFile = "";

InputFile="crc.input.txt";

mmInput->Lines->LoadFromFile(InputFile);
ansiMessage = mmInput->Lines->Text;

asciiMessage = ansi2ascii(ansiMessage);

koiMessage = ascii2koi(asciiMessage);

bitMessage = koi2bit(koiMessage, 8);

ShowBits(mmOutput,bitMessage,ansiMessage.Length()-1,8);
crc = crcMethod(bitMessage,ansiMessage.Length()-1,8);
ShowBits(mmMethod,crc,ansiMessage.Length()-1,4);
SaveToFileCRC("crc.output.txt", bitMessage, crc, ansiMessage.Length()-1);

}

void __fastcall TfrmMain::btnCloseClick(TObject *Sender)

{

Close();

}

Примеры работы программ

Кодирование с проверкой на четность.Кодирование







Вверху кодируемое сообщение (содержимое файла even.input.txt).
Слева внизу сообщение в котором каждая строка - битовое представление кода символа по таблице КОИ-7.
Справа внизу – результат кодирования. А именно биты четности для каждого байта.
Результат кодирования помещается в файл even.output.txt.








Кодирование с проверкой на четность. Декодирование.

тест при отсутствии ошибок



Все биты биты четности равны нулю


при наличии ошибок



  • сделана одна ошибка в первом байте, в третьем бите.

Результат: ошибка обнаружена


  • сделано две ошибки в седьмом байте, во втором и седьмом битах.

Результат: ошибка не обнаружена
- сделано три ошибки в девятом байте, в

третьем, четвертом и шестом битах

Результат: ошибка обнаружена
Примечание: нумерация с нуля, справа налево



Кодирование по методу Хэмминга. Кодирование







Вверху кодируемое сообщение (содержимое файла hamming.input.txt).
Слева внизу сообщение в котором каждая строка - битовое представление кода символа по таблице КОИ-7.
Справа внизу – результат кодирования. А именно (справа на лево) первый, второй, четвертый и восьмой контрольные биты в расширеном представлении числа.
Результат кодирования помещается в файл even.output.txt.



Кодирование по методу Хэмминга. Декодирование.

тест при отсутствии ошибок



Все контрольные биты равны нулю. Это значит, что ошибок нет.


при наличии ошибок



  • сделана одна ошибка в первом байте, в третьем бите.

Результат: ошибка обнаружена. Получен

двоичный номер бита с ошибкой.


  • сделано две ошибки в седьмом байте, во втором и седьмом битах.

Результат: ошибка обнаружена
- сделано три ошибки в девятом байте, в

третьем, четвертом и шестом битах

Результат: ошибка обнаружена
Примечание: нумерация с единицы, слева направо



Циклическое кодирование. Кодирование




Вверху кодируемое сообщение (содержимое файла crc.input.txt).
Слева внизу сообщение в котором каждая строка - битовое представление кода символа по таблице КОИ-7.
Справа внизу – результат кодирования. А именно отстаток CRC деления байта на 1011
Результат кодирования помещается в файл even.output.txt.


Циклическое кодирование. Декодирование.

тест при отсутствии ошибок



Все остатки от деления равны нулю Это значит, что ошибок нет.


при наличии ошибок



  • сделана одна ошибка в первом байте, в третьем бите.

Результат: ошибка обнаружена.


  • сделано две ошибки в седьмом байте, во втором и седьмом битах.

Результат: ошибка обнаружена
- сделано три ошибки в девятом байте, в

третьем, четвертом и шестом битах

Результат: ошибка обнаружена
Примечание: нумерация с единицы слева направо

Вывод.

В данной работе были реализованы методы помехозащищенного кодирования, а именно кодирование с проверкой на четность, код Хэмминга, циклическое кодирование. Был исследован канал передачи данных с возникновением 1, 2, 3 ошибок. Результаты работ каждого метода приведены в примерах работы программ. Наиболее хорошие результаты у метода Хэмминга т.к. он обнаруживает одну ошибку и указывает ее адрес, а в случае двух и трех ошибок хотя бы их обнаруживает. Чуть хуже результаты у циклического кодирования т.к. он только обнаруживает одну, две, три ошибки. Самые плохие результаты у кодирования спроверкой на четность, т.к. такой код обнаруживает только нечетное число ошибок, хотя он и прост в реализации.

Также в ходе проделаной работы было выяснено, что я едрёный программер, что круче меня только мой одногрупник Слава Дымов и что некоторые мои одногрупники нахалы и подлецы, т.к. будут сдавать то, что я писал целую неделю.

Учебный материал
© nashaucheba.ru
При копировании укажите ссылку.
обратиться к администрации