28 octombrie 2011

CRC is back!

Despre calculul CRC am mai scris si aici.
Dar de data asta am calculat mult mai explicit (babeste);


Pe scurt, avem doua programe numite Generator si Verifier (~ Sender si Receiver din foto)
* Generatorul ia ca input, de la tastatura, un sir de biti de m caractere numit "Data" si un sir de biti de (n+1) caractere, numit Divisor. Sirul de biti este simulat in C++ cu un string ale carui valori sunt 1 si 0 (dar nefacandu-se verificarea inputului);
* Lui Data i se ataseaza n biti de 0, si se "imparte" la Divisor (important, divizorul trebuie sa aiba primul si ultimul bit de 1).
* Impartirea nu este una normala ci una numita "Modulo 2 Division" (link) de unde ne intereseaza restul, care devine CRC. Am implementat-o pur si simplu babeste, asa cum se face pe hartie (dar asta nu inseamna ca e si usor de inteles...);
* Datei initiale i se va atasa acest CRC, servit ca output intr-un fisier, alaturi de Divisor, pe randul doi. Asta este ceea ce face Generator;
* Verifier ia din acelasi fisier Data si Divisor si le imparte unul la altul (in acelasi mod);
* Daca restul este 0, datele au fost transmise corect de la "sender" la "receiver", altfel exista erori.
* Pentru simularea erorii, intervine programul Alter, care intrand in fisierul scris de Generator, inverseaza random un bit din Data (oricare dar nu cel mai semnificativ); daca se ruleaza Verifier, rezultatul va fi eroare.

Programele se pot descarca de aici.

Niciun comentariu: