Traduire un algo en C++ vers Delphi

Sara_04
Messages postés
1
Date d'inscription
mardi 25 mai 2021
Statut
Membre
Dernière intervention
25 mai 2021
- Modifié le 26 mai 2021 à 10:06
cs_yanb
Messages postés
267
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
20 mai 2022
- 8 juil. 2021 à 15:39
bonjour chers amis ,
j' ai besoin d intégré dans mon projet delphi un algorithme de calcul CRC pour vérifier la totalité d une chaine de donnée Hex, je suis obligé d utiliser un algo type CRC16_mcrf4xx

malheureusement je n ai pas trouvé des articles qui explique clairement cet algo, par contre , j ai trouvé une implémentation en C, j espère trouvé ici une âme charitable qui pourrait m aider a traduire ce code :

https://gist.github.com/aurelj/270bb8af82f65fa645c1

#include <stdint.h>
#include <stddef.h>

uint16_t crc16_mcrf4xx(uint16_t crc, uint8_t *data, size_t len)
{
    if (!data || len < 0)
        return crc;

    while (len--) {
        crc ^= *data++;
        for (int i=0; i<8; i++) {
            if (crc & 1)  crc = (crc >> 1) ^ 0x8408;
            else          crc = (crc >> 1);
        }
    }
    return crc;
}

2 réponses

Whismeril
Messages postés
17482
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
3 juillet 2022
600
26 mai 2021 à 11:29
Bonjour

Tout d'abord, pense à remercier Karamel, qui a rendu ton code lisible.
Pour tes prochains posts, merci de lire et d'appliquer ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Je ne code pas du tout en Delphi et très très peu (et très très mal) en C, mais je peux te donner des pistes pour essayer de comprendre ce code.

Lire la doc sur les différents types de variables utilisées.
A noter qu'il y a des variables en 8bits et en 16 bits, je ne sais pas comment Delphi gère ça aujourd'hui dans des environnement 64bits.

Te renseigner sur la correspondance des opérateurs, par exemple == correspond à =, alors = correspond à :=

Te renseigner sur les opérateurs qui combinent une opération et une affectation par exemple
a += b
veut dire qu'on additionne les valeurs de a et de b et qu'on affecte le résultat à a.
a++
veut dire qu'on ajoute 1 à a et qu'on affecte le résultat à a.

Te renseigner sur les pointeurs,
*data
en est un.

Te renseigner sur l'algèbre de bool, car il y a des ou binaires, des et binaires et des décalages de bits.
Et ça ne coule pas de source, en bool, l'opérateur ou s'écrit + et "2 + 3" ça fait "3" parce que *2 c'est 10,
  • 3 c'est 11
  • bit à bit 0 ou 1 ça fait 1 et 1 ou 1 ça fait 1 aussi, donc 11 c'est 3.

En C l'opérateur ou s'écrit ^

0
cs_yanb
Messages postés
267
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
20 mai 2022
13
8 juil. 2021 à 15:39
Salut,

CRC16 mcrf4xx
Le polynome $1021
Le reflet $8408
Le reciproque $8810
...
Traduction de la fonction que tu donnes...
function StrToCRC16(S: string): UInt16;
var
  J : Integer;
  I  : Integer;
begin
  Result := 0;
  for J := 1 to Length(S) do
  begin
    Result := Result xor Ord(S[J]);
    for I := 1 to 8 do
    begin
      if Result and $0001 = $0001 then
	Result := (Result shr 1) xor $8408	  
      else
	Result := Result shr 1;
    end;
  end;
end;

@+
0