Скачиваний:
30
Добавлен:
02.05.2014
Размер:
5.5 Кб
Скачать
#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();    
}
//---------------------------------------------------------------------------



Соседние файлы в папке Coder