Libreria CRC Ridotta per .Net

For the english version of this page click here.

Index

Fondamenti del CRC

Perchè usare il CRC?

CRC è un acronimo che sta per cyclic redundancy check (controllo di ridondanza ciclica). Molto bene. Ma a cosa serve? Il CRC è un numero associato a uno flusso di bit. Immaginate di dover spedire un pacchetto di 8 bytes. Come potete sincerarvi di averli spediti correttamente? Per essere completamente sicuri potreste richiedere indietro gli stessi byte che avete inviato. Se li ricevete uguali potete stare (quasi) certi che sono stati inviati correttamente. Questo approccio funziona bene se necessitate di un alto livello di sicurezza. C'è però il problema della efficienza. Per ogni byte inviato ne ricevete uno. Per la maggior parte delle applicazioni questo prezzo da pagare è troppo alto.

Prima soluzione

Come prima soluzione potreste chiedere, invece che tutti i bytes inviati, la loro somma. Se spedite 8 e 22 sapete per certo che dovrete ricevere indietro il numero 30. In questo modo il rapporto è passato da 1:1 a 2:1. Questa soluzione però non è così buona come potrebbe sembrare a prima vista. In effetti il destinatario potrebbe aver ricevuto 15 e 15 e voi non ve ne accorgereste mai. Un altro problema è dato dall'overflow dei dati. E' facile sommando dei numeri che vanno da 0 a 255 superare il limite del byte (in questo caso 255). Abbiamo decisamente bisogno di una soluzione più affidabile.

CRC

Pensate al problema dell'overflow. Qual'è l'operatore degli interi che non supera mai un limite dato? Il modulo. n % 2 dà sempre 0 o 1. Il CRC funziona così. Usa una funzione incomprensibile chiamata polinomiale (che ora come ora non ci interessa approfondire... tutti i problemi matematici li ho risolti io per voi...). Voi date in pasto i byte alla mia libreria ed essa calcolerà il CRC per voi. Per inciso lo stesso TCP (internet) usa il CRC per assicurarsi che la trasmissione dei dati avvenga senza errori. In effetti la certezza assoluta non esiste dato che è possibile ottere lo stesso CRC da due differenti serie di bytes. La certezza è però statisticamente assicurata.

Sommario

Perchè ridotta?

Questa libreria è chiamata ridotta non perchè non funzioni bene (almeno dovrebbe ). Ridotta è per l'approccio che ha verso i files di grandi dimensioni. Normalmente un algoritmo CRC produrrebbe un valore scandagliando l'intero flusso di bytes. Ciò può essere accettabile per files dell'ordine dei KBytes ma oggigiorno sono in circolazione files di svariati megabytes (immaginate ai filmati video). La mia libreria genera un CRC basandosi su porzioni casuali del file. Invece che far impazzire l'hard disk per la lettura di 500 Mb avrete un CRC molto più rapido. Inevitabilmente questo approccio rendere meno rigoroso il CRC ottenuto, ma lo scadimento in termini statistici è di 1 su un milione. Dato il vantaggio prestazionale per me vale la pena. In ogni caso è possibile usare la libreria per produrre CRC rigorosi semplicemente trattando i files come flussi di bytes (incidentalmente è l'unico modo che avete a disposizione trattando flussi non skippabili). La decisione in questo caso sta a voi. <

Sommario

Installazione

Scaricate il file compresso. Decomprimetelo in una cartella temporanea. Nello zip c'è la DLL pronta per essere usata e il file help in formato HTML compresso. Una volta decompresso potete installare la DLL nel global assembly cache (GAC) oppure inserirla in una cartella di staging. Per installarla nel GAC aprite una shell di comando e digitate
gacutil /i MindFlavor.CRC.dll

Sommario

Uso

Cliccando qui si aprirà una nuova finestra con la documentazione completa. La versione compressa di questa documentazione è allegata nel file zip scaricabile.
Usare la libreria è facile: chiamate semplicemente il suo metodo statico CalculateCRC. Potete passare come parametro o un System.IO.FileInfo o una string per ottenere il CRC ridotto di un file. Alternativamente passate un flusso di byte per ottenere il CRC completo.

Sommario

Un esempio

Ho scritto una semplicissima applicazione da console per testare la libreria. Potete vedere il codice completo cliccando qui. Di seguito salterò il codice che gestisce la riflessione e commenterò il (breve) codice sul CRC.

...
...
...
	foreach(FileInfo fi in files)
	{
		uint uiCRC = CRC.CalculateCRC(fi);
		Console.WriteLine(fi.Name + "\tCRC: 0x" + uiCRC.ToString("x"));
	}
...
...
...

Passiamo semplicemente un System.IO.FileInfo al metodo statico CalculateCRC e otteniamo il risultato come intero senza segno. Il motivo che giustifica l'uso di un tipo a 32-bit quando il CRC calcolato è solo a 16-bit è l'efficienza. Per ottenere il CRC a 16-bit è sufficiente mascherare i bytes non necessari (o meglio ancora effettuare un cast non controllato).

Sommario

Download

Nome Dimensione Download
MindFlavor's Reduced CRC v1.0 (con file di help)
15 KB

Sommario

Ultimo aggiornamento: 15 maggio 2003

@2003 Francesco Cogno.