Newsgroup: it.comp.programmare.win32
Titolo: Algoritmo per calcolare il CRC ( Un pochino OT )

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
conterrannola 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
dellasequenza di dati fino all'esaurimento dei bit. Al termine, la
sequenza
chesi 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.
P.S Scusate del quesito un pochino OT ma ho proprio le idee confuse ;-))

 1010101010101010 ( AA ). Ciao a tutti e soprattutto BUON NATALE a tutti
ti consiglio questo tutorial passo passo .. e' molto chiaro:
http://huizen.dds.nl/~noway66/2000/enginering/crc.htm
Saluti,
 WalkerBoh