Bonjour tout le monde !

Jaimerais analyser un tag NFC iso14443b et comprendre comment cela fonctionne mais j’ai quelques soucis avec les CRC

Quand le tag est lu on peut voir certains CRC, mais si je veux modifier le contenu des données je dois etre capable de créer un checksum correspond aussi .. et la je bloque.. voici quelques exemples:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
#db# Address=00, Contents=dbce0cd3, CRC=2cbc
#db# Address=01, Contents=cc2b2edb, CRC=681c
#db# Address=02, Contents=ffffffff, CRC=470f
#db# Address=03, Contents=ffffffff, CRC=470f
j’ai trouvé le code source de la norme iso14443b pour calculer ce checksum mais en C ... or je suis pas très doué avec ce langage. Je sais comprendre les grandes lignes mais je n’arrive pas a transposer ce code en Perl correctement .. tous mes essais ont été infructueux.
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void
iso14443b_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc)
{
  uint32_t wCrc = 0xFFFF;
 
  do {
    uint8_t  bt;
    bt = *pbtData++;
    bt = (bt ^ (uint8_t)(wCrc & 0x00FF));
    bt = (bt ^ (bt << 4));
    wCrc = (wCrc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
  } while (--szLen);
  wCrc = ~wCrc;
  *pbtCrc++ = (uint8_t)(wCrc & 0xFF);
  *pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF);
}
 
/**
 * @brief Append CRC_B
 *
 */
void
iso14443b_crc_append(uint8_t *pbtData, size_t szLen)
{
  iso14443b_crc(pbtData, szLen, pbtData + szLen);
}

Est ce que quelqu’un pourrait m’aider a le retranscrire en Perl svp ? avec des comments dans le code si possible ? =)

Thanks =)