Newsgroup: it.comp.programmare
Titolo: Algoritmo per il calcolo del CRC

Ciao a tutti ! Io avrei la necessità di implementare in una mia
applicazioneuna funzione in grado si calcolare il CRC 16 ora ho trovato
qualcosina in rete, ma sfortunatamente ciò che ho letto non mi è molto
chiaro... provate a leggere uno stralcio di questo documento e se ci
capite qualcosa siete grandi ;-))
                       *** Algoritmo di calcolo ***
   L'algoritmo per il calcolo del CRC e' il seguente. Prendiamo, ad
esempio,
 il CRC-32, visto che il discorso e' lo stesso qualunque sia la
lunghezza della
 stringa di controllo. Si fissa un sequenza di 0 e 1 (detta 'CRC
polynomial'),
 che servira' come chiave di codifica, lunga quanto la stringa di
controllo che
 si vuole calcolare. In questo caso 32 bit. Ad esempio: 11100010101...0.
 Per convenienza di esposizione, indichiamo tale sequenza con la
seguente
 notazione vettoriale:
                           C(1) C(2) .... C(32).
   Si inizializzano dei registri, che al termine della procedura
conterranno
 la stringa di controllo (in questo caso sono 32) col il valore 0:
 Indichiamo tali registri come segue:
                           R(1) R(2) .... R(32).
 Immaginiamo ora la stringa di cui vogliamo calcolare il CRC come una
sequenza
 finita di 0 ed 1, del tipo, ad esempio: 10010100...0101.
 - Passi della procedura
 1) Si fanno scorrere di un posto verso sinistra i valori nei
 registri: deposito=R(1), R(1)=R(2),...., R(31)=R(32) e si pone 0 in
R(32).
 2) Il valore "uscente", che prima si trovava in R(1), e che ora e'
nella
 variabile che ho chiamato 'deposito', si "somma" al primo bit della
stringa
 di dati secondo la seguente tabella (questo tipo di operazione e'
conosciuta
 come OR esclusivo):
                                 0 + 0 = 0
                                 1 + 0 = 1
                                 0 + 1 = 1
                                 1 + 1 = 0.
 3) Il valore che si ottiene da tale somma viene "sommato", sempre
secondo
 la precedente tabella di addizione, solo a quei registri R(i) tali che
C(i)=1,
 mentre i registri R(j) tali che C(j)=0 vengono lasciati inalterati.
 4) Si itera la procedura dal punto 1 considerando il bit successivo
della
 sequenza di dati fino all'esaurimento dei bit. Al termine, la sequenza
che
 si trova nei registri
                            R(1) R(2) .... R(32)
 e' appunto il CRC-32 della sequenza di dati considerata. Essa viene
spesso
 mostrata in esadecimale, cioe' raggruppando le sequenza contigue di 4
bit
 (nibble) in un carattere del set esadecimale.
Ora mi è tutto chiaro sino al punto 2, ma quando passo a leggere il
punto 3, il buio totale mi circonda... secondo voi cosa vuole dire: solo
a quei registri R(i) tali che C(i)=1, mentre i registri R(j) tali che
C(j)=0 vengono lasciati inalterati. ?????
Sarò un pochino tardo ma personalmente non riesco a capirlo.
Se qualcuno di buon cuore avesse la pazienza di spiegarmi passo per
passo il calcolo da effettuare glie ne sarei veramente grato e ancora di
piu se mi riportasse un esempio di calcolo, ad esempio del numero
10101010 ( la lettera A ) con un CRC polynomial ad esempio di
1010101010101010 ( AA ). Ciao a tutti e soprattutto BUON NATALE a tutti
!  Dave.

 wrote in message
news:14956329...@libero.it...
