Explication Code C -> Vb

akuvido Messages postés 13 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 18 avril 2006 - 12 avril 2006 à 13:06
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 13 avril 2006 à 11:11
Bonjour,

Je dois pour une communication entre PC et automate analysé un protocole.
En l'analysant je me suis rendu compte que il y avais des CRC's ( verification de trame par ajout d'octet en fin de trame ).

J'ai alors demandé au constructeur de l'apareil la maniere de calculer le crc.

Celui ci m'as alors fourni les codes suivant :
Il y en 2 car il y a deux type de Crc sont utilisé

CRC 8 :

unsigned char calcHeaderCRC (unsigned char datavalue, unsigned char crcvalue)
{
Unsigned int crc;

crc = crcvalue ^ datavalue;
crc = crc ^ (crc<<1) ^ (crc<<2) ^ (crc<<3) ^ (crc<<4) ^ (crc<<5) ^ (crc<<6) ^ (crc<<7) ;

return (crc & Oxfe) ^((crc<<8) & 1);
}

CRC 16 :

unsigned int calcdataCRC (unsigned char datavalue, unsigned char crcvalue)
{
Unsigned int crclow;

crclow = (crcvalue & 0xff) ^ datavalue;
return ((crcvalue>>8) ^ (crclow<<8) ^ (crclow<<3) ^ (crclow<<12) ^ (crclow>>4) ^ (crclow & 0x0f) ^ ((crclow & 0x0f)<<7)) ;

}

Malheusement pour moi, J'ignore totalement le Language C car je dois pour se projet travailler en Visual basic.

J'aurai voulu savoir si il y avais ame charitable qui pourrais m'expliquer le fonctionnement de ce code pour que je puisse alors le traduire en Visual basic.

Apres quelque recherche, j'ai pu comprendre que le ^ est un Ou exclusif , le & un ET binaire et >>X sont des decalage de bits et que le X est le "nombre" de rang du decalage et le sens des > le sens du decalage.

Voila merci infiniment !

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 avril 2006 à 19:20
VB ignore les décalages de bits.
Mets cela dans une dll C que tu appelleras depuis ton VB.

ciao...
BruNews, MVP VC++
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 avril 2006 à 09:24
si VB connait pas les décalages de bits avec des divisions et multiplications devrait passer non ?

crc>>1 <=> cr/2
crc>>2 <=> cr/4
crc>>3 <=> cr/8
crc>>4 <=> cr/16
crc>>5 <=> cr/32
crc>>6 <=> cr/64
crc>>7 <=> cr/128
crc>>8 <=> crc/256

crc<<1 <=> crc*2
crc<<2 <=> crc*4
crc<<3 <=> crc*8
crc<<4 <=> crc*16
crc<<5 <=> crc*32
crc<<6 <=> crc*64
crc<<7 <=> crc*128
crc<<8 <=> crc*256

& <=> And
^ <=> Xor

J'espère que VB connait And et Xor.
0
akuvido Messages postés 13 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 18 avril 2006
13 avril 2006 à 09:34
Merci de ton aide,

Quelqu'un m'a deja proposé ca, et j'en suis arrivé à ca ...

unsigned char calcHeaderCRC (unsigned char datavalue, unsigned char crcvalue)
{
Unsigned int crc;

crc = crcvalue ^ datavalue;
crc = crc ^ (crc<<1) ^ (crc<<2) ^ (crc<<3) ^ (crc<<4) ^ (crc<<5) ^ (crc<<6) ^ (crc<<7) ;

return (crc & Oxfe) ^((crc<<8) & 1);
}


devient

public function calcHeaderCRC (datavalue as integer, crcvalue as integer) as integer
dim crc as integer
crc = crcvalue xor datavalue
crc = crc xor (crc *2) xor (crc*4) xor (crc*8) xor (crc*16) xor (crc*32) xor (crc*64) xor (crc *128)
calcHeaderCRC = (crc and &HFE) Xor ((crc * 256) And 1)
end function



mais mon probleme se situe autre part maintenant car vu le nombre de multiplication, j'arrive a un overflow a tout les coups !

J'aurai voulu savoir si sous C ce probleme est egalement present.

Merci de votre aide
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 avril 2006 à 10:23
C'est spécifique aux langages interprétés l'overflow en rapport au type de variable.

Remplacer des shift par 8 divisions et autant de multiplications, bouhhh faudra pas être pressé !!!

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 avril 2006 à 10:50
en passant par des unsigned long pour faire les calculs peut-être

mais clair qu'en C c'est plus rapide ce genre de truc.

VB optimize même pas un minimun derrière les multiplication/division de puissance de 2 ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 avril 2006 à 11:11
ah non, vb n'optimise rien du tout sinon il ne pourrait pas envoyer d'exception overflow.
Un prog vb n'est pas fait pour être rapide.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous