Permet de vérifier l'intégrité d'un message via un CRC (Cyclic Redundancy Check)
Source / Exemple :
#include <iomanip.h>
#include <iostream.h>
#include <conio.h>
#include <windows.h>
// PROTOTYPES DES FONCTIONS
void AfficherAscii(char TabChar[]);
void AfficherBinaire(char TabChar[]);
void AfficherBinaire2(unsigned char Element);
void CRC(char TabChar[]);
void Entree (void);
void Erreur(void);
void Rotation(char TabChar[]);
// VARIABLES GLOBALES
const int Nb_Elem = 7;
const int Nb_Bits = 8;
unsigned char A, B, C, D;
unsigned char Gen;
unsigned char MasqueMax = 0x80;
unsigned char MasqueMin = 0x01;
unsigned char Reste = 0x00;
char TabChar[7];
//FONCTION PRINCIPALE
void main(void)
{
char ChoixNext, ChoixErreur;
while (ChoixNext != 'n')
{
Entree();
cout << "\nVoici le message en code ASCII (avec espaces): " << endl;
AfficherAscii(TabChar);
cout << "\n\nVoici la trame originale en code binaire (avec espaces): "
<< endl;
AfficherBinaire(TabChar);
cout << "\n\nVoici le CRC applique sur la trame originale (le reste etant"
" depose dans la premiere section de la trame: " << endl;
CRC(TabChar);
AfficherBinaire(TabChar);
cout << "\n\nVoici la trame pour la deuxieme application du CRC: " << endl;
TabChar[5] = Reste<<5;
TabChar[0] = 0x00;
AfficherBinaire(TabChar);
Erreur();
cout << "\nVoici la trame resultante en code binaire (avec espaces): "
<< endl;
CRC(TabChar);
AfficherBinaire(TabChar);
cout << "\n\nVoici le reste final: ";
AfficherBinaire2(Reste);
if (Reste != 0)
MessageBox(NULL,"Une erreur s'est glissée dans le message",
"ERREUR",MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL);
else
MessageBox(NULL,"Transmission valide réussie",
"SUCCES",MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL);
cout << endl << "\nVoulez-vous faire un autre CRC Oui (o) ou Non (n) ? ";
cin >> ChoixNext;
}
clrscr();
gotoxy(30, 13);
cout << "A U R E V O I R !";
getch();
}
//ENTREE DU MESSAGE ET DU GENERATEUR
void Entree(void)
{
int i, GenerateurInt;
clrscr();
for (i = 0; i < Nb_Elem; i++)
TabChar[i] = 0x00;
cout << "Entrez vos 4 caracteres pour le message (sans espaces): ";
for (i = 1; i < 5; i++)
cin >> TabChar[i];
cout << "\nEntrez le generateur a utiliser (11, 13 ou 15): ";
cin >> GenerateurInt;
Gen = GenerateurInt;
TabChar[6] = Gen;
return;
}
//AFFICHAGE DES 4 CARACTERES DU MESSAGE EN ASCII
void AfficherAscii(char TabChar[])
{
int Val;
for(int i=1;i<5;i++)
{
Val = (int)TabChar[i];
cout << Val << " ";
}
return;
}
//AFFICHAGE BINAIRE DE LA TRAME EN ENTIER
void AfficherBinaire(char TabChar[])
{
for (int i= 0; i < Nb_Elem; i++)
{
for (int j = Nb_Bits-1;j>-1;j--)
{
cout << ((TabChar[i] >> j) & 1);
if (!(j%8)) // s'il ne reste rien après la division de i par 8
cout << " ";
}
}
return;
}
// AFFICHAGE BINAIRE DU RESTE
void AfficherBinaire2(unsigned char Element)
{
int Temp[8];
for (int j = Nb_Bits-1;j>-1;j--)
{
Temp[7-j] = Element & MasqueMin;
Element = Element >> 1;
}
for (int j = Nb_Bits-1;j>-1;j--)
{
cout << Temp[j];
}
return;
}
//APPLICATION DU CRC (VALEUR OBTENUE DU RESTE)
void CRC(char TabChar[])
{
char Quotient = 0x00;
int Nb_Decalages = 35;
char *Message = new char[5];
for (int i=0; i<=4; i++)
{
Message[i] = TabChar[i+1];
}
while (Nb_Decalages > 0)
{
if (Quotient < 8)
{
Quotient = Quotient << 1;
Nb_Decalages--;
if (Message[0] & MasqueMax)
Quotient++;
Rotation(Message);
}
else
{
Reste = Quotient ^ Gen;
Quotient = Reste;
}
}
Reste = Quotient;
if (Reste >= 8)
Reste = Reste ^ Gen;
TabChar[0] = Reste;
return;
}
// ROTATION DES BITS VERS LA GAUCHE DES ELEMENTS DU MESSAGE
void Rotation(char Message[])
{
for (int i=0; i<5; i++)
{
Message[i] = Message[i]<<1;
if ((Message[i+1] & MasqueMax) && (i!=4))
Message[i] = Message[i] + MasqueMin;
}
return;
}
// FONCTION INSÉRANT UNE ERREUR DANS LA TRAME
void Erreur(void)
{
char ChoixErreur;
int Position;
cout << "\n\nVoulez-vous inserer une erreur dans la trame originale Oui (o) ou"
" Non (n)? ";
cin >> ChoixErreur;
if (ChoixErreur == 'o')
{
cout << "\nQuelle position voulez-vous modifier (1, 2, 3 ou 4)? : ";
cin >> Position;
TabChar[Position] = 0xFFFFFFFF;
}
return;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.