PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → JE VEUT CONVERTIR UN CODE EN WINDEV
JE VEUT CONVERTIR UN CODE EN WINDEV
Débuté par eriktuz, 17 juin 2024 20:32 - 22 réponses
Membre enregistré
40 messages
Posté le 17 juin 2024 - 20:32
SALUT

JE veut convertir ce code pour utiliser dont mon projet windev

unsigned long crc_buffer(unsigned long crc, const unsigned long *p, unsigned long sz)
{
   const unsigned long poly = 0xEDB88320;
   unsigned long tmp1, tmp2;

   while(sz--)
   {
      tmp1 = 0;
      tmp2 = crc & poly;
      for(int i = 0; i <=31; i++ )
      tmp1 ^= ((tmp2 >> i) & 1);
      crc = *p++ ^ ((crc << 1) | tmp1) ;
   }
   return crc;
}
Membre enregistré
407 messages
Posté le 18 juin 2024 - 08:23
Bonjour,

Pas sûr que tu sois sur le bon forum. Là tu es sur du booléen, du masquage et du décalage de bits, à mon avis le WLangage n'est pas fait pour ça. Ça semble être du C : as-tu essayé de l'intégrer directement en tant que code C ? Lorsque tu crées une fonction, regarde en haut, tu peux choisir le langage.
Si ça peut t'être utile, un décalage de bit vers la gauche correspond à une multiplication par 2 et à droite une division par 2.

La prochaine fois, ajoute quand-même un peu de contexte et agrémente d'un "SVP" ou "merci d'avance", ça donne plus envie de répondre.
Membre enregistré
491 messages
Posté le 18 juin 2024 - 08:27
Bonjour

demandez à chatgpt
Message modifié, 18 juin 2024 - 08:31
Posté le 18 juin 2024 - 09:05
Bonjour,
Prenez dans Outil
WDAPI,
il y a un convertisseur dedans aussi.
Membre enregistré
4 325 messages
Posté le 18 juin 2024 - 12:20
Pucpood a écrit :
Bonjour,

Là tu es sur du booléen, du masquage et du décalage de bits, à mon avis le WLangage n'est pas fait pour ça.

Non le WLangage n'est pas fait pour ça, mais il peut le faire. Tout est expliqué dans le chapitre "Opérateurs binaire"
Rq 1 : l'opérateur C "^" correspond au OU exclusif ("||")
A la volée :
FONCTION crc_buffer(DMCrc est entier sans signe,ptrPtr est entier système,DMSize est entier sans signe) : entier sans signe
DMPoly est entier sans signe
DMTmp1,DMTmp2 sont entier sans signe
nCompteur est entier

DMPoly=0xEDB88320

DMSize--
TANTQUE DMSize>0
DMTmp1=0
DMTmp1=DMCrc & DMPoly
POUR nCompteur=0 À 31 //Attention, en c les indices commencent à 0 et à 1 en WL il est possible que l'on ait POUR nCompteur=1 À 32
DMTmp1=DMTmp1||(bitDécaleDroite(DMTmp2,nCompteur)&1)
ptrPtr++
DMCrc=ptrPtr||(bitDécaleGauche(DMCrc,1)|DMTmp1)
FIN
FIN

RENVOYER DMCrc


Rq 2 : ptrPtr est un pointeur sur en entier sans signe, il faudra dond passer l'adresse de cet entier lors de l'appel de la fonction

--
Il y a peut être plus simple, mais, ça tourne
Posté le 18 juin 2024 - 13:13
l'outil windev n'a pas l'air de convertir ce code

^ = OUExclusifBinaire
>> = bitDécaleDroite
<< = bitDécaleGauche

Bon courage
Membre enregistré
32 messages
Posté le 18 juin 2024 - 14:53
Rechercher
"EDB88320" "CRC32" "Windev" ...
Membre enregistré
4 325 messages
Posté le 18 juin 2024 - 15:08
Jean-Jacques (WebJaseur) a écrit :
l'outil windev n'a pas l'air de convertir ce code

Il n'a jamais converti le code, uniquement le prototype de la fonction

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
407 messages
Posté le 19 juin 2024 - 14:20
Voroltinquo a écrit :
Non le WLangage n'est pas fait pour ça, mais il peut le faire. Tout est expliqué dans le chapitre "Opérateurs binaire"
Rq 1 : l'opérateur C "^" correspond au OU exclusif ("||")
...


Merci de ces précisions.

Monsieur ERIK, un petit retour après ces réponses intéressantes ?
Membre enregistré
40 messages
Posté le 19 juin 2024 - 18:31
pour calculer le CRC32 il faut determiner 3 parametres : (crc, p, sz)
EXEMPLE: POUR CETTE CHAIN
36 00 F2 78 E2 09 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 6F 79 00 00 B1 6F 00 00 85 7C 88 7C


CS1 = F2 78
ID = 36 00
crc is initial value of CS1
P : DATA
SZ : IS SIZE

le cs1 est calculer avec ce code EN C:

unsigned long crc_buffer(unsigned long crc, const unsigned long *p, unsigned long sz)
{
const unsigned long poly = 0xEDB88320;
unsigned long tmp1, tmp2;

while(sz--)
{
tmp1 = 0;
tmp2 = crc & poly;
for(int i = 0; i <=31; i++ )
tmp1 ^= ((tmp2 >> i) & 1);
crc = *p++ ^ ((crc << 1) | tmp1) ;
}
return crc;
}
Message modifié, 19 juin 2024 - 18:33
Membre enregistré
40 messages
Posté le 19 juin 2024 - 18:34
INIT = 00000036
LENGTH = 0000001F
DATA: E20900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F790000B16F0000857C887C
CS1=78F2 -> OK
Membre enregistré
40 messages
Posté le 19 juin 2024 - 18:39






Membre enregistré
40 messages
Posté le 19 juin 2024 - 18:52
MERCI BEAUCOUP VOROLTINQUO MAIS COMMENT DONNER LES 3 PARAMETRES:

jai cette erreur :

Les paramètres d'appel du code 'Clic sur BTN_SansNom5' sont incorrects : on attendait 3 paramètres et on en a reçu 0.
Message modifié, 19 juin 2024 - 18:52
Membre enregistré
40 messages
Posté le 19 juin 2024 - 18:58
tout les eeprom divised sur des blocks avec 0x80 size
offsets:
0x00 - block id (half word)
0x02 - CS1 (half word)
0x04 - block revision Huh
0x08 - data
0x7C - CS2 (word)

les 3 parametres : (crc, p, sz)
pour mon projet je suit intereser au CRC32 32bit checksum cs2




Membre enregistré
40 messages
Posté le 19 juin 2024 - 19:05
JE DONNE UN REAL EXEMPLE :

E9 CB 01 00 B1 1E 67 CF 2D 9B D7 E5 AD 71 AD 71
AD 71 0A 2C AC D6 45 34 82 14 17 A8 96 73 96 73
B9 26 72 B0 BE 51 BE 51 2C 53 DE 3A CC D5 CC D5
DA 7E DC 10 15 DF EA D2 2C 36 C2 6F 11 B5 7C 31
2C 36 2C 36 E2 E1 28 85 C3 51 FC EC 5D 4C BA E9
2B 22 2C 36 2C 36 BA E9 2B 22 4D 74 D1 F7 E5 DF
5D 64 FF 87 58 56 8A 97 6B 85 C4 36 86 E6 45 9C
8B B5 30 AE FC 62 03 00 B4 62 03 00 BA 71 53 C2






le checksum pour cette exemple est : 53 C2

Mais comment calculer
Message modifié, 19 juin 2024 - 19:08
Membre enregistré
40 messages
Posté le 19 juin 2024 - 19:25
MONSIEUR Voroltinquo

Où faut-il écrire les 3 paramétres dans ton code ?
Membre enregistré
4 325 messages
Posté le 20 juin 2024 - 12:03
Avant de récupérer du code que tu ne comprend pas, il aurait fallu que tu te renseignes sur la manière dont se calcule un CRC.
Dans les grandes lignes, quel que soit le protocole, le CRC correspond au reste d'une division modulo 2 sur les bits de données. Chaque protocole se base sur un polynôme et une ou plusieurs valeurs initiales.
Dans ton cas le polynôme est connu : 0xEDB88320. En ce qui concerne la valeur initiale, elle est donnée en fin de bloc (ou presque,) ce sont les bits de 0x78 à 0x7B (la partie en bleu) donc 0x5B100000.
En ce qui concerne les données "utiles" elles commencent à 0x08 et se terminent à 0x77. La taille est la taille de ce buffer.

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
4 325 messages
Posté le 20 juin 2024 - 16:35
Ca
la peur se traduire par :
FONCTION VerifierCRCTrame(bufTrame est Buffer) : booléen
bufMsg est un Buffer
DMInit est entier sans signe sur 4 octets
DMCRCEnvoyé est entier sans signe sur 4 octets

bufMsg=bufTrame[[0x08 À 0x77]]
DMInit=bufTrame[[0x78 À 0x7B]]
DMCRCEnvoyé=bufTrame[[0x7C À 0x7F]]

SI crc_buffer(DMInit,&bufMsg,Taille(bufMsg))=DMCRCEnvoyé ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN


Utilisation :
SI VerifierCRCTrame(bufTrame) ALORS
//Traiter ACK
SINON
//Traiter NAK
FIN


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
40 messages
Posté le 20 juin 2024 - 18:32
JAI connue comment calculer le crc mathematiquement mais j'arive pas a traduire en code windev

pour les variables :
valeur initial
la taille du buffer
le polynom
crc

comment utilser dont ce code :
FONCTION crc_buffer(DMCrc est entier sans signe,ptrPtr est entier système,DMSize est entier sans signe) : entier sans signe

DMPoly est entier sans signe
DMTmp1,DMTmp2 sont entier sans signe
nCompteur est entier

DMPoly=0xEDB88320
DMSize--

TANTQUE DMSize>0



DMTmp1 = 0
DMTmp1 = DMCrc & DMPoly
POUR nCompteur=0 À 31 //Attention, en c les indices commencent à 0 et à 1 en WL il est possible que l'on ait POUR nCompteur=1 À 32
DMTmp1=DMTmp1||(bitDécaleDroite(DMTmp2,nCompteur)&1)
ptrPtr++
DMCrc=ptrPtr||(bitDécaleGauche(DMCrc,1)|DMTmp1)
FIN
FIN

RENVOYER DMCrc


ou faut -il declarer les valeures des variables
Membre enregistré
40 messages
Posté le 20 juin 2024 - 18:45
tu peut test ton code avec un exemple pour je comprendre :(:(

tu peu calculer le crc2 pour cette exemple et me donner le code windev :
parceque je comprend rien
E9 CB 01 00 B1 1E 67 CF 2D 9B D7 E5 AD 71 AD 71
AD 71 0A 2C AC D6 45 34 82 14 17 A8 96 73 96 73
B9 26 72 B0 BE 51 BE 51 2C 53 DE 3A CC D5 CC D5
DA 7E DC 10 15 DF EA D2 2C 36 C2 6F 11 B5 7C 31
2C 36 2C 36 E2 E1 28 85 C3 51 FC EC 5D 4C BA E9
2B 22 2C 36 2C 36 BA E9 2B 22 4D 74 D1 F7 E5 DF
5D 64 FF 87 58 56 8A 97 6B 85 C4 36 86 E6 45 9C
8B B5 30 AE FC 62 03 00 B4 62 03 00 BA 71 53 C2


et merci beaucoup
Message modifié, 20 juin 2024 - 18:47
Membre enregistré
40 messages
Posté le 22 juin 2024 - 14:15
MONSIEUR Voroltinquo

s'il te plait je finir mon project il reste seulement cette etap de checksum

donc donne moi un code windev pour calculer le crc32 pour cette exemple

E9 CB 01 00 B1 1E 67 CF 2D 9B D7 E5 AD 71 AD 71
AD 71 0A 2C AC D6 45 34 82 14 17 A8 96 73 96 73
B9 26 72 B0 BE 51 BE 51 2C 53 DE 3A CC D5 CC D5
DA 7E DC 10 15 DF EA D2 2C 36 C2 6F 11 B5 7C 31
2C 36 2C 36 E2 E1 28 85 C3 51 FC EC 5D 4C BA E9
2B 22 2C 36 2C 36 BA E9 2B 22 4D 74 D1 F7 E5 DF
5D 64 FF 87 58 56 8A 97 6B 85 C4 36 86 E6 45 9C
8B B5 30 AE FC 62 03 00 B4 62 03 00 BA 71 53 C2


jai calculer avec un autre logiciel est me donne un checksum 53 C2 latest 2 byte mais comment je ne c'est pas ......any changement dans la chain elle change les dernier 2 bytes




Message modifié, 22 juin 2024 - 14:16
Membre enregistré
40 messages
Posté le 22 juin 2024 - 17:26
apres des recherche je trouve que le checksum est L'inverse d'un CRC-16/XMODEM

je utiliser ce code WINDEV:

POUR CALCULER COMME EXEMPLE : le crc du cette chain :
(0x0C,0x01,0x05,0x00,0x00,0x00,0x09,0x67,0x65,0x74,0x69,0x6E,0x66,0x6F,0x0D,0x0A,0x01)

nCRC, nC are 2-byte unsigned int
tabTableCRC is array of 256 2-byte unsigned int
nPoly is 2-byte unsigned int = 0x8408
bufReplay is Buffer = [0x0C,0x01,0x05,0x00,0x00,0x00,0x09,0x67,0x65,0x74,0x69,0x6E,0x66,0x6F,0x0D,0x0A,0x01]

FOR i = 0 TO 255
nCRC = 0
nC = i
FOR j = 0 TO 7
IF ((nCRC || nC) & 0x0001) <> 0 THEN
nCRC = (nCRC bitRightShift 1) || nPoly
ELSE
nCRC = nCRC bitRightShift 1
END
nC = nC bitRightShift 1
END
tabTableCRC[i + 1] = nCRC
END

nCRC = 0
FOR j = 1 _TO_ Length(bufReplay)
nC = Asc(bufReplay[[j]]) & 0xFF
nCRC = (nCRC bitRightShift 8) || tabTableCRC[((nCRC || nC) & 0xFF) + 1]
END

sNCRC2 est une chaîne
sNCRC2 = EntierVersHexa(nCRC)
Trace(sNCRC2)


je trouve le resultat : 0000FA3D

et apres la comparison avec https://crccalc.com/ est juste






j'ai utiliser le polynom : 0x1021 et le problem il ya beaucoup polynom avec le meme poly la defference c'est ref-in and ref-out ,
comment obtenir le resultat de (refin :false , refout false) pour obtenir le resultat de CRC-16/XMODEM
Message modifié, 22 juin 2024 - 17:27
Membre enregistré
40 messages
Posté le 22 juin 2024 - 21:32
le problem est resolu :D:D merci beaucoup Voroltinquo et tout les amis
Message modifié, 22 juin 2024 - 22:24