PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Recoder le calcul d'un CRC32b depuis le langage C
Recoder le calcul d'un CRC32b depuis le langage C
Débuté par Laurent PERETTO, 25 juin 2019 14:50 - 6 réponses
Membre enregistré
32 messages
Posté le 25 juin 2019 - 14:50
Je me tourne vers vous car je dois bien avouer que je cale sur un sujet qui me "semble" pourtant simple... Je m'explique.

Dans le cadre d'un développement, je dois implémenter un dialogue avec un TPE sur un protocole qui n'est pas CONCERT. JE le précise car j'ai déjà vu beaucoup de topics sur ce sujet. Le protocole en question doit rester confidentiel, je ne peux donc être que succin dans les informations que je transmet. La communication s'effectue via port Série, fonction sOuvre, etc... Ce protocole nécessite le calcul d'un CRC32. Ce calcul du CRC , selon la documentation fournie pour le protocole ET les essais que j'ai effectués, ne semble pas se limiter à la fonction sCalculeCrc32 de WD.

Donc, la documentation fourni un exemple de fonction effectuant le calcul demandé que vous pourrez trouver à l'ANNEXE 1 . Ce code est en C et, même si cela fait très longtemps que je n'en ai pas fait, je pense l'avoir compris.

J'ai donc tenté de le recoder en WD mais sans résultat ( code source dans l'ANNEXE 2 ).

Pour l'exemple :
la donnée d'entrée est : 00 05 6E 6C 65 6E 33 30 30 30 33 32 32 38 31 37 31 37 32 39 33 37 33 31 33 30 33 31 30 36 36 38 30 31 39 32 33 36 32 36
la donnée attendue après le calcul du CRC est : 5C A4 C5 7F

Je dois bien avouer que je ne trouve rien de correspondant... Je suis ouvert à toute proposition / correction / amélioration / baffe car j'avoue que je m'arrache les cheveux sur ce problème là

Annexe1:
/*-
* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
* code or tables extracted from it, as desired without restriction.
*
* First, the polynomial itself and its table of feedback terms. The
* polynomial is
* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
*
* Note that we take it "backwards" and put the highest-order term in
* the lowest-order bit. The X^32 term is "implied"; the LSB is the
* X^31 term, etc. The X^0 term (usually shown as "+1") results in
* the MSB being 1
*
* Note that the usual hardware shift register implementation, which
* is what we're using (we're merely optimizing it by doing eight-bit
* chunks at a time) shifts bits into the lowest-order term. In our
* implementation, that means shifting towards the right. Why do we
* do it this way? Because the calculated CRC must be transmitted in
* order from highest-order term to lowest-order term. UARTs transmit
* characters in order from LSB to MSB. By storing the CRC this way
* we hand it to the UART in the order low-byte to high-byte; the UART
* sends each low-bit to hight-bit; and the result is transmission bit
* by bit from highest- to lowest-order term without requiring any bit
* shuffling on our part. Reception works similarly
*
* The feedback terms table consists of 256, 32-bit entries. Notes
*
* The table can be generated at runtime if desired; code to do so
* is shown later. It might not be obvious, but the feedback
* terms simply represent the results of eight shift/xor opera
* tions for all combinations of data and CRC register values
*
* The values must be right-shifted by eight bits by the "updcrc
* logic; the shift must be unsigned (bring in zeroes). On some
* hardware you could probably optimize the shift in assembler by
* using byte-swap instructions
* polynomial $edb88320
*
*
* CRC32 code derived from work by Gary S. Brown.
*/
 
#include 
#include 
static uint32_t crc32_tab[] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
 
uint32_t crc32(uint32_t crc, const void *buf, size_t size)
{
const uint8_t *p;
p = buf;
crc = crc ^ ~0U;
while (size--)
{
crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
}
return crc ^ ~0U;
}
 
/* This example code was located at http://www.opensource.apple.com/source/xnu/xnu-
1456.1.26/bsd/libkern/crc32.c */




Annexe2:

tab_Data est un tableau de chaînes
tab_CRC_Obtenu est un tableau de chaînes

n_A est un entier sur 4 octets sans signe
n_B est un entier sur 4 octets sans signe
n_C est un entier sur 4 octets sans signe
n_D est un entier sur 4 octets sans signe
n_CRC est un entier sur 4 octets sans signe

crc32_tab est un tableau d'entiers sur 4 octets sans signe

//Etant donné que la communication s'effectue octet par octet,
// les donnée dont on doit trouver le CRC sont stockées sous
// forme de chaine dans le tableau tab_Data. Pour retrouver
// la valeur de l'octet, il suffit d'effectuer un VAL( donnée, "x")

//Data : 00 05 6E 6C 65 6E 33 30 30 30 33 32 32 38 31 37 31 37 32 39 33 37 33 31 33 30 33 31 30 36 36 38 30 31 39 32 33 36 32 36
//CRC attendu : 5C A4 C5 7F

TableauAjoute(tab_Data, "00")
TableauAjoute(tab_Data, "05")
TableauAjoute(tab_Data, "6E")
TableauAjoute(tab_Data, "6C")
TableauAjoute(tab_Data, "65")
TableauAjoute(tab_Data, "6E")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "32")
TableauAjoute(tab_Data, "32")
TableauAjoute(tab_Data, "38")
TableauAjoute(tab_Data, "31")
TableauAjoute(tab_Data, "37")
TableauAjoute(tab_Data, "31")
TableauAjoute(tab_Data, "37")
TableauAjoute(tab_Data, "32")
TableauAjoute(tab_Data, "39")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "37")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "31")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "31")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "36")
TableauAjoute(tab_Data, "36")
TableauAjoute(tab_Data, "38")
TableauAjoute(tab_Data, "30")
TableauAjoute(tab_Data, "31")
TableauAjoute(tab_Data, "39")
TableauAjoute(tab_Data, "32")
TableauAjoute(tab_Data, "33")
TableauAjoute(tab_Data, "36")
TableauAjoute(tab_Data, "32")
TableauAjoute(tab_Data, "36")

crc32_tab = [...
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,...
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,...
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,...
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,...
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,...
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,...
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,...
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,...
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,...
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,...
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,...
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,...
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,...
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,...
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,...
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,...
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,...
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,...
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,...
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,...
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,...
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,...
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,...
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,...
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,...
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,...
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,...
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,...
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,...
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,...
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,...
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,...
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,...
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,...
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,...
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,...
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,...
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,...
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,...
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,...
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,...
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,...
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d...
]

//crc = crc ^ ~0U;
n_CRC = OUExclusifBinaire(n_CRC, 0x00000000)

//while (size--) <= On part de la fin du buffer pour aller au début
POUR n_Indice = tab_Data..Occurrence _A_ 1 PAS -1

// On va décomposer les étapes trouvées dans le code en C pour plus de clarté

// A = crc ^ *p++
// n_A = OUExclusifBinaire(n_CRC, Val(tab_Data[n_Indice],"x"))
n_A = n_CRC || Val(tab_Data[n_Indice],"x")

// B = A & 0xFF
// n_B = ETBinaire(n_A, 0xFF)
n_B = n_A & 0xFF

// C = crc32_tab[B]
n_C = crc32_tab[n_B + 1] //=> +1 parceque quand tu traduis du C en WinDev, tu commences les tableaux à 1

// D = crc >> 8
// n_d = n_CRC bitDécaleDroite(8)
n_D = n_CRC bitDécaleDroite 8

// CRC = C ^ D
// n_CRC = OUExclusifBinaire(n_C, n_D)
n_CRC = n_C || n_D

FIN

//return crc ^ ~0U
n_CRC = OUExclusifBinaire(n_CRC, 0x00000000)

ChaîneVersTableau(EntierVersHexa(n_CRC, 2),tab_CRC_Obtenu," ")

//CRC attendu : 5C A4 C5 7F

STOP


--
Laurent P
Membre enregistré
948 messages
Posté le 25 juin 2019 - 21:08
Bonsoir
je serais à votre place, vu que vous avez le source en C, je ferais une petite Dll
Je vous l'aurais bien compilée mais il manque les 2 noms des fichiers include
Message modifié, 25 juin 2019 - 21:12
Membre enregistré
948 messages
Posté le 25 juin 2019 - 22:08
bonsoi r
j'ai fait une petite dll avec le code fourni et avec comme donnée d'entrée : 00 05 6E 6C 65 6E 33 30 30 30 33 32 32 38 31 37 31 37 32 39 33 37 33 31 33 30 33 31 30 36 36 38 30 31 39 32 33 36 32 36 elle me renvoie : 0xD442A44F
Auriez vous un autre exemple ?
Membre enregistré
948 messages
Posté le 25 juin 2019 - 22:44
Je viens de vérifier, le polynôme utilisé dans le code C est celui du CRC-32-IEEE802.3 le même que Windev
Pour la chaine : "nlen3000322817172937313031066801923626"
le programme C donne : 0x0A8B2101
windev donne : 0x0A8B2101
le site https://crccalc.com/ donne : 0x0A8B2101
le site https://www.lammertbies.nl/comm/info/crc-calculation.html donne : 0x0A8B2101
j'en conclu que soit votre exemple est erroné soit le code C ne correspond pas à votre crc
Membre enregistré
948 messages
Posté le 26 juin 2019 - 15:35
Bonjour
Après vérifications votre code comporte 3 erreurs:
1° il ne faut pas parcourir le buffer à l'envers car "size" est un compteur, c'est "p" le pointeur et il est incrémenté
2° dans "crc = crc ^ ~0U;" vous oubliez l'opérateur "~" --> "NONBinaire(0x00000000)"
3° dans "return crc ^ ~0U;" vous oubliez l'opérateur "~" --> "NONBinaire(0x00000000)"
et là vous aurez le même résultat que la fonction Windev
Membre enregistré
32 messages
Posté le 26 juin 2019 - 16:24
Merci beaucoup !

--
Laurent P
Membre enregistré
948 messages
Posté le 28 juin 2019 - 16:20
Bonjour,
Voici une fonction permettant de changer le polynôme utilisé pour calculer un CRC32. Par défaut c'est le même polynôme que celui de la fonction windev : sCalculeCrc32 qui est : 0xEDB88320

Procedure CalcCRC32(pmyBuffer est un Buffer, pReCalculTable est un booléen = False, pPolynome entiers sans signe sur 4 octets = 0xEDB88320):entiers sans signe sur 4 octets
Crc, nA est un entiers sans signe sur 4 octets
i, j est un entier
crc32_tab est un tableau d'entiers sans signe sur 4 octets

crc32_tab = [...
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,...
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,...
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,...
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,...
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,...
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,...
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,...
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,...
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,...
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,...
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,...
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,...
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,...
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,...
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,...
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,...
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,...
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,...
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,...
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,...
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,...
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,...
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,...
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,...
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,...
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,...
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,...
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,...
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,...
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,...
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,...
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,...
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,...
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,...
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,...
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,...
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,...
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,...
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,...
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,...
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,...
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,...
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d...
]

// Initialisation de la table en fonction du polynôme sinon polynôme par défaut (celui de windev) : 0xEDB88320
IF pReCalculTable THEN
FOR i=1 _TO_ 256
Crc = i-1
FOR j=1 _TO_ 8
IF ETBinaire(Crc, 0x1) THEN
Crc = OUExclusifBinaire(bitDécaleDroite(Crc, 1), pPolynome)
ELSE
Crc = bitDécaleDroite(Crc, 1)
END
END
crc32_tab[i] = Crc
END
END

Crc = 0xFFFFFFFF
FOR i = 1 _TO_ Taille(pmyBuffer)
nA = ETBinaire(OUExclusifBinaire(Crc, Asc(pmyBuffer[[i]])), 0x000000FF)
Crc = OUExclusifBinaire(crc32_tab[nA + 1], bitDécaleDroite(Crc, 8))
END
Crc = OUExclusifBinaire(Crc, 0xFFFFFFFF)

RENVOYER Crc