Newsgroup: it.comp.lang.c
Titolo: CRC32, help

Salve, ho trovato una funzione che calcola il crc32, il suo prototipo e' il
seguente:
unsigned long crc32(void *buffer, unsigned int count, unsigned long crc)
ho fatto varie prove (non ne capisco niente di matematica e poco di
programmazione)
e ho notato che cambiando i valori di count e di crc, cambiano pure i valori
restituiti dalla funzione, qualcuno mi saprebbe spiegare come funziona?
(eventualmente posso postare il src)
Se qualcuno ha gia implementato un controllo crc nei propri progetti, sarei
felicissimo di parlarne...
Grazie mille a tutti
See Ya

 restituiti dalla funzione, qualcuno mi saprebbe spiegare come funziona?
La sfera di cristallo e' in riparazione, tiro ad indovinare.
Visto che crc32 prende un void*, count dovrebbe essere la dimensione
del buffer: giocarci non e' una cosa salutare, soprattutto se la
dimensione reale del buffer e piu' piccola di quella passata in count.
Per unsigned long crc posso solo ipotizzare che sia un codice che
dica alla funzione quale algoritmo per il calcolo del crc usare...
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

> La sfera di cristallo e' in riparazione, tiro ad indovinare.
In effetti sono rimasto un po troppo vago...pero' non credo che sia politica
del gruppo ricevere attach...
Mi permetto, questa volta, di inviare la sola funzione principale...magari
qualcuno me la saprebbe commentare :(
unsigned long crc32(void *buffer, unsigned int count, unsigned long crc)
{
unsigned long temp1, temp2;
static int firsttime = 1;
unsigned char *p = (unsigned char *)buffer;
if (firsttime)
{
if (BuildCRCTable())
return -1;
firsttime = 0;
}
while (count-- != 0)
{
temp1 = (crc >> 8) & 0x00FFFFFFL;
temp2 = CRCTable[((int)crc ^ *p++) & 0xFF];
crc = temp1 ^ temp2;
}
return crc;
}
Non ho idea di chi sia il codice, non e' commentato, ne' firmato ... cmq e'
qui :D
Grazie a chi mi aiutera' ^_^
See Ya

 return -1;
Posta pure il codice di BuildCRCTable().


}
   "crc" viene passato alla funzione per indicarle il valore iniziale
del crc.
   Perche` passarle il valore iniziale di crc? Perche` cosi` puoi
calcolare il crc di un file grosso dividendolo in piu` blocchi:
calcoli il crc per il primo blocco, carichi il secondo blocco e
continui a calcolare il crc, passando alla funzione non solo
l'indirizzo del blocco e la quantita` di byte contenuti nel blocco, ma
anche il crc del blocco precedente. Cosi' facendo otterrai lo stesso
valore di crc, sia dividendo il file in blocchi, sia calcolandolo in
un'unica passata.
-- 
S.L.

 Posta pure il codice di BuildCRCTable().
credo che il giovane abbia preso il codice qui:
http://www.theorem.com/java/crc2.c
ciao,
g.

 
http://www.theorem.com/java/crc2.c
Non da qui, ma il src e' lo stesso.
^_^
See Ya

 un'unica passata.
quindi alla prima passata gli passo un null ?
o se devo calcolare solo una parte...
Tnx
See Ya

 quindi alla prima passata gli passo un null ?
Gli passi 0, NULL e' un puntatore.


bene bene...
ora mi manca l'ultimo pezzettino :)
strlen funziona solo con i *char, credo...
se io invece avessi:
long data[1024];
fread(data, sizeof(data), 1,fp);
Ossia, se ho ben capito come funge, leggo un blocco da 1k dal file puntato
da fp e lo salvo in data...
posso usare
crc32(data, sizeof(data), 0) ?
e successivamente magari passare al posto di 0, il valore di ritorno del
crc32 precedente?
Grazie mille...per l'ennesima volta :D

 crc32 precedente?
Direi che e' quello che DEVI fare, altrimenti il CRC che ottieni e'
(o dovrebbe essere) quello dell'ultimo blocco per cui e' stato
calcolato.
HTH
