Titolo: Creazione di un codice di controllo CRC
Categoria: Codice |
|
Ultimo Aggiornamento: 17/08/04 |
Il codice di controllo CRC, Cyclic Redundancy Check, serve a controllare l'integrità di un insieme di dati, sia esso un file, un pacchetto di bit sulla rete, il testo di una email.
La procedura proposta è ricavata dalla Nota Tecnica di 4d 99-11, dove viene spiegato il processo di calcolo del CRC: in pratica si dividono con operazioni binarie tutti i byte dell'insieme di dati per un polinomio di partenza e si conserva il resto come codice di controllo (o checksum).
In pratica è quasi impossibile che una modifica ai dati diano come risultato lo stesso codice CRC. Il polinomio di partenza consigliato è quello usato nelle trasmissioni Ethernet e nel programma di compressione PkZip.
C_BLOB($1;$blob) `contiene l'insieme di dati da controllare
C_LONGINT($0;$CRC_L;$REG_L;$TOP_L;$i;$j)
C_BOOLEAN(<>crc_setupFatto_b) `serve a controllare che il setup sia fatto almeno e solo una volta
If (Not(<>crc_setupFatto_b))
`prepara una volta soltanto l'array con le operazioni di shift e XOR
`con il polinomio usato come radice del CRC
ARRAY LONGINT(<>crcTable_al;255)
C_REAL($CRCSetup_r;$CRC32_r)
$CRC32_r:=0x04C11DB7 `polinomio usato come base di calcolo
For ($i;0;255)
$CRCSetup_r:=$i
For ($j;0;7) `bit shift a destra e XOR con il polinomio
If (($CRCSetup_r & 1)=1)
$CRCSetup_r:=(($CRCSetup_r >> 1) ^| $CRC32_r)
Else $CRCSetup_r:=$CRCSetup_r >> 1
End if End for <>crcTable_al{$i}:=
Abs($CRCSetup_r)
End for <>crc_setupFatto_b:=
TrueEnd if $CRC_L:=0xFFFFFFFF
SET BLOB SIZE(vblob;BLOB size(vblob)+4;0x0000)
$REG_L:=
BLOB to longint(vblob;0)
For ($i;0;
BLOB size(vblob)-5)
$TOP_L:=(($REG_L >> 24) & 0x00FF)
$CRC_L:=<>crcTable_al{$TOP_L}
$REG_L:=(($REG_L << 8) | vblob{$i+4}) ^| $CRC_L
End for $0:=Abs($REG_L)
Inviato da: Umberto Migliore |
|
Visite: 14623 |
Se accedi con utente e password, puoi aggiungere dei commenti.