Calcul d'un crc16 (cyclic redundancy check)

Soyez le premier à donner votre avis sur cette source.

Vue 25 392 fois - Téléchargée 2 550 fois

Description

Calcul du CheckSum d'une chaine de caractères représentant un flux en héxadécimal.
Version 1
Division de la chaine par le polynome
CRC16 = 0x1021 (x^16 + x^12 + x^5 +1)

Conclusion :


Version 1
Réalise uniquement une division "made in CRC"
Version 2 en cours

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
8
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
10 août 2009

Une solution plus simple serait de modifier l'appel dans le programme

/ au lieu de
CRC = ValCRC16(Form1.ValCalcul.Text & "0000", Form1.Poly.Text)

/ nouvel appel
CRC = ValCRC16("FFFF" & Form1.ValCalcul.Text & "0000", Form1.Poly.Text)
Messages postés
8
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
10 août 2009

bonjour , cela fait peut être trop longtemps que le sujet n'est pas commenté, mais je me permet de faire une remarques.

L'etude exhaustive de sources de provenance différentes et de langages différents ( VB ,DELPHI , C++ ) montre que l'initialisation n'est peut être pas effectuée correctement !!
n'ayant aucune application qui utilise le CRC_CCITT_V41 je n'ai pu vérifié !
( toutefois, ci dessous une suggestion de modification )

Function ValCRC16(UneChaine As String, Polynome As String) As String
Dim x As Long
' -------- au lieu de ValCRC16 = Mid(UneChaine, 1, 4)
ValCRC16 = &HFFFF ' initialisation
' --------- au lieu de For x = 17 To Len(UneChaine) * 4
For x = 17 To (( Len(UneChaine) +2 ) * 4) ' modification de la taille
If (PrefixHexa & ValCRC16 And &H8000) > 0 Then
ValCRC16 = BitLeft(ValCRC16, ValBit(UneChaine, x))
ValCRC16 = Hex((PrefixHexa & ValCRC16) Xor (PrefixHexa & Polynome))
ValCRC16 = String(4 - Len(ValCRC16), "0") & ValCRC16
Else
ValCRC16 = BitLeft(ValCRC16, ValBit(UneChaine, x))
End If
Next x
End Function
Messages postés
13
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
18 avril 2006

D'accord merci quand meme pour ton aide

Bonne continuation
Messages postés
10
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
10 avril 2006

Bonjour akuvido

Depuis aout 2005, j'ai oublié les détails à propos de cette histoire. Je n'ai pas le temps de re-travailler le sujet en ce moment.
Le principe que tu évoques me semble, à la première lecture, correct.

Dans le principe, après avoir refait la division, vu que le résultat de la soustraction pour le bit de poids fort est toujours nul, et vu, que le bit de poids fort d'un polynome est toujours 1, j'ai certaiment simplifié le problème en réalisant une soustraction sur quatre bits et non sur cinq ... A vérifier si je ne me suis pas planté en programmant cela ...

Bonne réception
Marc VB
Messages postés
13
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
18 avril 2006

Oui, Je suis désolé pour l'orthographe.

Je vais montrer comment j'ai compris la chose et tu me diras si ca te semble cohérant

Si le message à transferer est 11 0101 1011 (h'35B) et que le polynome générateur est 10011 :

Il faut d'abord decaler le message à transmettre de 4 rangs ( degres du polynome ou nombre de bits - 1 )

On se retrouve avec Ceci : 11 0101 1011 0000

On procede alors à une division de 11 0101 1011 0000 par 10011 (polynome ).

On recuperer le reste de la division qui est 1110.

On fait alors : 11 0101 1011 0000 Xor 1110

Ceci qui nous donne alors le message a transmettre suivi de son CRC : 11 0101 1011 1110


Je pense que j'ai bien compris la chose mais tu me dis que le bit de poids fort n'est pas utile.

Donc je demande comfirmation

Merci d'avance
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.