Vés al contingut

Càlcul de controls de redundància cíclica

De la Viquipèdia, l'enciclopèdia lliure
Exemple de generació d'un CRC de 8 bits. El generador és un registre de desplaçament de tipus Galois amb portes XOR col·locades segons potències (números blancs) de x en el polinomi del generador. El flux de missatges pot tenir qualsevol longitud. Després que s'hagi desplaçat pel registre, seguit de 8 zeros, el resultat al registre és la suma de control.

El càlcul d'una comprovació de redundància cíclica es deriva de les matemàtiques de la divisió polinòmica, mòdul dos. A la pràctica, s'assembla a una llarga divisió de la cadena de missatges binari, amb un nombre fix de zeros afegits, per la cadena "polinomi generador", excepte que l'exclusiva o les operacions substitueixen les restes. La divisió d'aquest tipus es realitza de manera eficient en maquinari mitjançant un registre de desplaçament modificat,[1] i en programari mitjançant una sèrie d' algorismes equivalents, començant amb un codi senzill proper a les mat[2]emàtiques i fent-se més ràpid (i possiblement més ofuscat [3]) a través de byte. paral·lelisme intel·ligent i compensacions espai-temps.[4]

Comprovació de les dades rebudes amb checksum. El missatge rebut es desplaça pel mateix registre que s'utilitza al generador, però la suma de comprovació rebuda s'hi adjunta en lloc de zeros. Les dades correctes donen el resultat de tots zeros; un bit danyat en el missatge o la suma de comprovació donaria un resultat diferent, advertint que s'ha produït un error.

Diversos estàndards CRC amplien l'algoritme de divisió polinòmica especificant un valor inicial de registre de desplaçament, un pas final d'O exclusiu i, el més crític, una ordenació de bits (endianness). Com a resultat, el codi vist a la pràctica es desvia de manera confusa de la divisió "pura",[5] i el registre pot desplaçar-se cap a l'esquerra o cap a la dreta.

Exemple

[modifica]

Com a exemple d'implementació de la divisió polinomial al maquinari, suposem que estem intentant calcular un CRC de 8 bits d'un missatge de 8 bits fet del caràcter ASCII "W", que és binari 01010111₂, decimal 87 10 o hexadecimal 57 16. Per il·lustració, utilitzarem el polinomi CRC-8-ATM (HEC). . Escriure el primer bit transmès (el coeficient de la potència més alta de ) a l'esquerra, correspon a la cadena de 9 bits "100000111".

El valor del byte 57 16 es pot transmetre en dos ordres diferents, depenent de la convenció d'ordenació de bits utilitzada. Cadascun genera un polinomi de missatge diferent . Msbit primer, això és = 01010111, mentre que lsbit-primer, ho és = 11101010. Després es poden multiplicar per per produir dos polinomis de missatges de 16 bits .

El càlcul de la resta consisteix llavors a restar múltiples del polinomi generador . Això és com una divisió llarga decimal, però encara més senzill perquè els únics múltiples possibles a cada pas són 0 i 1, i les restes prenen prestades "de l'infinit" en lloc de reduir els dígits superiors. Com que no ens importa el quocient, no cal registrar-lo.

Most-significant bit first
0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
= 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 1 1
= 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
= 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0
1 0 0 0 0 0 1 1 1
= 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0
= 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0
1 0 0 0 0 0 1 1 1
= 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0
1 0 0 0 0 0 1 1 1
= 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 0 0 0 0 0
= 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0

Observeu que després de cada resta, els bits es divideixen en tres grups: al principi, un grup que és tot zero; al final, un grup que no canvia respecte a l'original; i un grup ombrejat blau al mig que és "interessant". El grup "interessant" té una longitud de 8 bits, que coincideix amb el grau del polinomi. A cada pas, es resta el múltiple adequat del polinomi per fer el grup zero un bit més llarg, i el grup sense canvis es fa un bit més curt, fins que només queda la resta final.

En l'exemple msbit-primer, el polinomi restant és . Convertint a un nombre hexadecimal utilitzant la convenció que la potència més alta de x és el msbit; això és A2 16. A lsbit-first, la resta és . Convertint a hexadecimal utilitzant la convenció que la potència més alta de x és lsbit, això és 19 16.

Implementació

[modifica]

Escriure el missatge complet a cada pas, tal com es fa a l'exemple anterior, és molt tediós. Les implementacions eficients utilitzen un -Registre de desplaçament de bits per contenir només els bits interessants. Multiplicant el polinomi per equival a desplaçar el registre d'un lloc, ja que els coeficients no canvien de valor sinó que només es mouen cap al següent terme del polinomi.

Aquí teniu un primer esborrany d'algun pseudocodi per calcular un CRC de n bits. Utilitza un tipus de dades compost per a polinomis, on x no és una variable entera, sinó un constructor que genera un objecte polinomi que es pot afegir, multiplicar i exponenciar. A xor dos polinomis és sumar-los, mòdul dos; és a dir, excloure OR els coeficients de cada terme coincident dels dos polinomis.


Referències

[modifica]
  1. Dubrova, Elena. «A BDD-Based Approach to Constructing LFSRS for Parallel CRC Encoding». A: 2012 IEEE 42nd International Symposium on Multiple-Valued Logic (en anglès), maig 2012, p. 128–133. DOI 10.1109/ISMVL.2012.20. ISBN 978-0-7695-4673-5. 
  2. «"Computation of Cyclic Redundancy Checks via Table Look-Up"» (en anglès).
  3. Williams, Ross N. «A Painless Guide to CRC Error Detection Algorithms V3.00» (en anglès), 24-09-1996. Arxivat de l'original el 2006-09-27. [Consulta: 16 febrer 2016].
  4. «"A BDD-Based Approach to Constructing LFSRS for Parallel CRC Encoding"» (en anglès).
  5. Williams, Ross N. «A Painless Guide to CRC Error Detection Algorithms V3.00» (en anglès), 24-09-1996. Arxivat de l'original el 2006-09-27. [Consulta: 16 febrer 2016].